标签:计算器算法
运算符的先后计算可以用栈来保存,分别有几种情况
1,当前1+2-3即优先级相同,那么可以先算前一个。
2,1+2*3这种情况我不做处理(注:我每次只选择是否处理上一个)
3,2*8+2这种情况计算前一个。
小细节太多,不说太多,有兴趣的同学留言。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<stack>
#include<cstring>
#include<algorithm>
using namespace std;
stack<int>num,opt;
int deal()
{
int now=opt.top();opt.pop();
int last=opt.top();opt.pop();
if(last/2<now/2)
{
opt.push(last),opt.push(now);
return 1;
}
int a=num.top();num.pop();
int b=num.top();num.pop();
int c=num.top();num.pop();
if(last==0)num.push(c+b);
else if(last==1)num.push(c-b);
else if(last==2)num.push(c*b);
else if(last==3&&b)num.push(c/b);
else return 2;
num.push(a);opt.push(now);
return deal();
}
int solve(char* ss)
{
int len=strlen(ss),cur=0;
int tmp=0;
while(cur<len&&ss[cur]!=' ')
if(ss[cur]>='0'&&ss[cur]<='9')tmp=tmp*10+ss[cur]-'0',cur++;
else return false;
num.push(tmp);opt.push(-2);
while(cur<len)
{
if(ss[++cur]=='+')opt.push(0);
else if(ss[cur]=='-')opt.push(1);
else if(ss[cur]=='*')opt.push(2);
else if(ss[cur]=='/')opt.push(3);
else return 0;
if(ss[++cur]==' ')cur++;
else return 0;
tmp=0;
while(cur<len&&ss[cur]!=' ')
if(ss[cur]>='0'&&ss[cur]<='9')tmp=tmp*10+ss[cur]-'0',cur++;
else return 0;
num.push(tmp);
if(deal()==2)return 2;
}
opt.push(0);num.push(0);deal();
return 1;
}
int getans()
{
num.pop();
return num.top();
}
int main()
{
char ss[200];
while(gets(ss))
{
int key=solve(ss);
if(key==1)printf("%d\n",getans());
else if(key==0)printf("格式错误\n");
else printf("逻辑错误(被除数可能为零?)\n");
while(!num.empty())num.pop();
while(!opt.empty())opt.pop();
}
return 0;
}标签:计算器算法
原文地址:http://blog.csdn.net/u014569598/article/details/40452983