运算符的先后计算可以用栈来保存,分别有几种情况
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; }
时间: 2024-10-07 06:47:51