PTA 后缀式求值(整型版)

我们人类习惯于书写“中缀式”,如 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;
} 

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值