表达式求值(pta题目)

输入一个每个运算数都仅为一位数且只包含+ - * /运算符的后缀表达式,要求计算该表达式的值。

输入格式:

测试数据有多组,处理到文件尾。每组测试数据输入一个字符串(仅可能包含数字字符和+ - * /,不超过20个字符)表示的后缀表达式。

输出格式:

对于每组测试,输出后缀表达式的计算结果,结果保留两位小数。

输入样例:

123*+68/-
931-3*+82/+

输出样例:

6.25
19.00

来源:

黄龙军, 等. 数据结构与算法(Python版),上海: 上海交通大学出版社, 2023. ISBN: 9787313280732

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

AC代码

思路:主要是理解后缀表达式的计算规则。可以看这篇->后缀表达式看完这一篇文章就理解了!-CSDN博客

  1. 不想看也没事,给你总结了:
  2. 输入是数字,直接入栈;
  3. 输入是运算符号op,取从栈中最上面两个元素(栈顶a,及栈顶下面的b), 然后把b op a(不要颠倒了,加乘还好,减除没有交换律!)计算出来的结果入栈。
  4. 最后栈中肯定只剩一个数字,就是最终答案。
  5. 注意输入的都是字符,所以运算时减字符‘0’转整数
  6. 我用的是STL(懒得手写栈),stack没有清空栈的API(你问为什么要清空?题目说了是多组输入噢!),所以直接用vector代替。
#include<iostream>
#include<vector>
using namespace std;
int main() {
	string ins;
	while (cin >> ins) {
		vector<double> v;
		for (int i = 0; i < ins.size(); i++) {
			if (isdigit(ins[i])) {
				v.push_back(ins[i]);
			}
			else {
				//取出栈最上面的两个元素,记得转成整数
				double a = v.back() - '0';
				v.pop_back();
				double b = v.back() - '0';
				v.pop_back();
				//switch进行对应的符号运算
				switch (ins[i]) {
				case '+':
					v.push_back((b + a) + '0');
					break;
				case '-':
					v.push_back((b - a) + '0');
					break;
				case '*':
					v.push_back((b * a) + '0');
					break;
				case '/':
					v.push_back((b / a) + '0');
					break;
				}
			}
		}
		printf("%.2f\n", v.back() - '0');
		//清空栈,进入下组样例
		v.clear();
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值