题目描述
输入一行表示后缀表达式,注意每个数或符号之间有一空格隔开,最后输入@表示输入结束。(给定的表达式不超过 10001000 个字符)
注意:本题中遇到除法运算,只需要计算整除的结果,不需要保留小数。
输入
将输入的后缀表达式求值后输出。
测试数据保证表达式中整数数值 以及 整数之间进行加减乘除运算得到的结果都在 00~108108的范围内。
输出
输出一个整数,表示该表达式的值。
样例
输入
14 3 20 5 / * 8 - + @
输出
18
#include<iostream> #include<stack> #include<string> using namespace std; int main(){ stack<int> a; string s; int p,q,w; while(cin >> s && s != "@"){ if(s == "+" || s == "-" || s == "*" || s == "/") { q = a.top(); a.pop(); p = a.top(); a.pop(); if(s == "+") w = p + q; else if(s == "-") w = p - q; else if(s == "*") w = p * q; else if(s == "/") w = p / q; a.push(w); } else a.push(stoi(s)); } cout << a.top(); }后缀表达式求值的核心数据结构是栈,规则非常简单:
- 从左到右逐个遍历表达式里的元素
- 如果遇到数字,就把它压入栈中
- 如果遇到运算符,就从栈顶弹出两个元素:
- 先弹出的是右操作数
b,后弹出的是左操作数a - 计算
a 运算符 b的结果(比如遇到+就算a+b,遇到/就算a//b) - 把计算得到的新结果重新压入栈中
- 先弹出的是右操作数
- 遍历结束之后,栈里只会剩下一个元素,这个元素就是整个后缀表达式的最终结果。
这道后缀表达式求值题目,核心用到了C++ STL里的std::stack容器适配器。
push():把读取到的数字压入栈顶top():获取栈顶的元素,拿到待运算的操作数pop():弹出已经参与完运算的栈顶元素- 最后遍历结束后,栈里仅剩的元素就是最终的计算结果。