luogu1449 后缀表达式
时空限制 1000ms/128MB
题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
输入输出格式
输入格式:
输入:后缀表达式
输出格式:
输出:表达式的值
输入输出样例
输入样例#1:
3.5.2.-*7.+@
输出样例#1:
16
说明
字符串长度,1000内。
代码
#include<iostream>
#include<string>
#include<stack>
using namespace std;
stack<int> snum;
void calculate(char ch){ //从栈中取出2个数字,进行运算,结果入栈
int x=snum.top(); snum.pop(); //取栈顶
int y=snum.top(); snum.pop(); //取新栈顶
switch (ch){
case '+': y+=x; break;
case '-': y-=x; break;
case '*': y*=x; break;
case '/': y/=x; break;
}
snum.push(y); //计算结果入栈
}
int main(){
string s;
cin>>s;
for (int i=0,len=s.size()-1; i<len; ){ //字符串逐个扫描
if (isdigit(s[i])){ //数字,计算值,并入栈
int x=0;
while (isdigit(s[i])) x=10*x+s[i++]-'0';
snum.push(x); //数字入栈
}
else calculate(s[i]); //运算符,计算
i++; //指向字符串的下一字符
}
cout<<snum.top()<<endl; //栈顶
return 0;
}