输入一个每个运算数都仅为一位数且只包含+ - * /
运算符的后缀表达式,要求计算该表达式的值。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据输入一个字符串(仅可能包含数字字符和+ - * /
,不超过20个字符)表示的后缀表达式。
输出格式:
对于每组测试,输出后缀表达式的计算结果,结果保留两位小数。
输入样例:
123*+68/-
931-3*+82/+
输出样例:
6.25
19.00
来源:
黄龙军, 等. 数据结构与算法(Python版),上海: 上海交通大学出版社, 2023. ISBN: 9787313280732
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
AC代码
思路:主要是理解后缀表达式的计算规则。可以看这篇->后缀表达式看完这一篇文章就理解了!-CSDN博客
- 不想看也没事,给你总结了:
- 输入是数字,直接入栈;
- 输入是运算符号op,取从栈中最上面两个元素(栈顶a,及栈顶下面的b), 然后把b op a(不要颠倒了,加乘还好,减除没有交换律!)计算出来的结果入栈。
- 最后栈中肯定只剩一个数字,就是最终答案。
- 注意输入的都是字符,所以运算时减字符‘0’转整数
- 我用的是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;
}