算法与数据结构——栈实现表达式求值
题目:
代码:
#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; } //乘除法优先,括号和加减都是1,乘除是2 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] != '(') 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]-'0';//转化为数字 } 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; }
参考:栈实现表达式求值 - 清梦韶华 - 博客园 (cnblogs.com)