7-2 栈实现表达式求值
使用键盘输入数学表达式(含数字,四种运算符+、-、、/和小括号,其中运算数都是一位数(0~9)),将数学表达式转化成后缀表达式输出,利用后缀表达式求表达式的值并输出。
输入格式:
输入正确的表达式(可以有空格)后回车,得到后缀表达式和结果。输入括号缺失的表达式,输出"ERROR:缺少括号"。输入两个除括号外运算符连续的表达式,输出"ERROR:表达式缺操作数"。
输出格式:
请在这里描述输出格式。例如:对每一组输入,在一行中输出A+B的值。
输入样例:
在这里给出一组输入。例如:
5*(8-(3+2))
结尾无空行
输出样例:
在这里给出相应的输出。例如:
5832+-*
15
结尾无空行
代码:
#include<iostream> #include<cstdio> #include<string> using namespace std; const int N=100010; string split(string s){ string ss; for(int i=0;i<s.size();i++){ if(s[i]==32) continue; ss+=char(s[i]); } return ss; } bool ck1(string s){ int cnt=0; for(int i=0;i<s.size();i++){ if(s[i]=='(') cnt++; else if(s[i]==')') cnt--; } return cnt==0; } bool ck2(string s){ for(int i=0;i<s.size();i++){ if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){ if(i==0||i==s.size()-1||i&&(s[i-1]=='+'||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/')){ return 0; } } } return 1; } int pri(char ch){return ch=='*'||ch=='/'?2:1;} char ch[N]; int cnt; string cg(string s){ string ss; for(int i=0;i<s.size();i++){ if(s[i]>='0'&&s[i]<='9'){ ss+=char(s[i]); }else{ if(s[i]=='('){ ch[cnt++]='('; }else if(s[i]==')'){ while(ch[cnt-1]!='('){ ss+=ch[--cnt]; } cnt--; }else{ char c=char(s[i]); if(cnt>0&&pri(c)<=pri(ch[cnt-1])){ while(cnt>0&&ch[cnt-1]!='('&&pri(c)<=pri(ch[cnt-1])){ ss+=ch[--cnt]; } } ch[cnt++]=c; } } } while(cnt>0){ ss+=ch[--cnt]; } return ss; } int op(int x,int y,char ch){ if(ch=='+') return x+y; else if(ch=='-') return x-y; else if(ch=='*') return x*y; else return x/y; } int a[N],ct; int op(string s){ for(int i=0;i<s.size();i++){ if(s[i]>='0'&&s[i]<='9'){ a[ct++]=s[i]-48; } else{ int x=a[ct-2],y=a[ct-1]; ct-=2; a[ct++]=op(x,y,char(s[i])); } } return a[0]; } int main(){ string s; getline(cin,s); s=split(s); if(!ck1(s)){ cout<<"ERROR:缺少括号"; return 0; } if(!ck2(s)){ cout<<"ERROR:表达式缺操作数"; return 0; } string ss=cg(s); cout<<ss<<endl; cout<<op(ss); return 0; }