题目描述
为了便于处理表达式,常常将普通表达式(称为中缀表示)转换为后缀{运算符在后,如X/Y写为XY/表达式。在这样的表示中可以不用括号即可确定求值的顺序,如:(P+Q)*(R-S) → PQ+RS-*。后缀表达式的处理过程如下:扫描后缀表达式,凡遇操作数则将之压进堆栈,遇运算符则从堆栈中弹出两个操作数进行该运算,将运算结果压栈,然后继续扫描,直到后缀表达式被扫描完毕为止,此时栈底元素即为该后缀表达式的值。
输入
输入一行表示后缀表达式,数与数之间一定有空格隔开(可能不只一个空格),最后输入@表示输入结束。
数据保证每一步的计算结果均为不超过100000的整数。
输出
输出一个整数,表示该表达式的值.
样例输入 Copy
14 3 20 5 / * 8 - + @
样例输出 Copy
18
代码实现
#include <bits/stdc++.h>
using namespace std;
int re(int aa,int bb,char ch)
{
if(ch=='+') return aa+bb;
else if(ch=='-') return aa-bb;
else if(ch=='*') return aa*bb;
else if(ch=='/') return aa/bb;
}
int main(){
stack<int> dig;
stack<char> op;
char ch[100];
int flag1=0,flag2=0,a;
while( cin >> ch){
if(ch[0]=='@'){
cout << dig.top() << endl;
break;
}
if(ch[0]=='+'||ch[0]=='-'||ch[0]=='*'||ch[0]=='/'){
flag1 = 1;
op.push(ch[0]);
}else{
flag2++;
a = 0;
for(int i=0;ch[i]!='\0';i++){
a=a*10+(ch[i]-48);
}
dig.push(a);
}
if(flag1 && flag2 >=2){
int bb=dig.top();
dig.pop();
int aa=dig.top();
dig.pop();
char e = op.top();
int result = re(aa,bb,e);
dig.push(result);
flag2--;
flag1 = 0;
}
}
return 0;
}