我们人类习惯于书写“中缀式”,如 3 + 5 * 2
,其值为13
。 (p.s. 为什么人类习惯中缀式呢?是因为中缀式比后缀式好用么?)
而计算机更加习惯“后缀式”(也叫“逆波兰式”,Reverse Polish Notation)。上述中缀式对应的后缀式是: 3 5 2 * +
现在,请对输入的后缀式进行求值。为了简化输入处理和运算,运算数(操作数)不超过30
个且均为不超过5位的正整数,运算符(操作符)仅有+ - * /
(加减乘除)四种。题目保证运算的中间结果和最终结果都在整型范围内,且不会出现除数为0的情况。
输入格式:
第一行给出一个不超过10的正整数k;
接下来k行,每行给出一个后缀式,以=
号结束,运算符、运算数和=
号之间均以一个空格间隔。
输出格式:
输出有k行,对于所输入的每个后缀式,判断是否正确(可求值),并在一行里输出:
- 如果后缀式无误、可求值,输出结果
- 如果后缀式错误,则输出
Expression Error!
输入样例1:
2
1 2 3 4 + - * =
10 2 3 + / 4 * 5 - =
输出样例1:
-5
3
输入样例2:
2
10 2 / =
10 2 + - =
输出样例2:
5
Expression Error!
解题思路:用栈存数字,然后判断加减乘除,做完操作后放入栈
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
string s;
while(t--){
int f=0;
stack<int> sz;
while(cin>>s&&s!="="){
if(f==1)continue;
if(s!=" "&&s!="+" &&s!="-" &&s!="*" &&s!="/"){
sz.push(stoi(s));
}else if(s!=" "){
if(sz.size()<=1){
cout<<"Expression Error!"<<endl;
f=1;
continue;
}
int a=sz.top();
sz.pop();
int b=sz.top();
sz.pop();
if(s=="+"){
sz.push(b+a);
}
if(s=="-"){
sz.push(b-a);
}
if(s=="*"){
sz.push(b*a);
}
if(s=="/"){
sz.push(b/a);
}
}
}
if(f==0 &&sz.size()==1)cout<<sz.top()<<endl;
else if(sz.size()>1)cout<<"Expression Error!"<<endl;
}
return 0;
}
标签:输出,中缀,后缀,样例,PTA,整型,&&,求值
From: https://blog.csdn.net/2302_81344882/article/details/136846112