问题描述:
- 根据逆波兰表示法,求后缀表达式的计算结果。
- 有效的运算符包括
+
、-
、*
、/
。 - 每个运算对象可以是整数,也可以是另一个逆波兰表达式。
- 整数除法只保留整数部分。
- 给定逆波兰表达式总是有效的。
- 逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
- 平常使用的算式则是一种中缀表达式,如
( 1 + 2 ) * ( 3 + 4 )
。 - 该算式的逆波兰表达式写法为
( ( 1 2 + ) ( 3 4 + ) * )
。
核心思路:
- 因为表达式总是有效,所以不需要考虑分母为
0
的特殊情况。 - 后缀表达式比较容易求值,因为加减乘除运算符均是二元运算符,所以用栈来保存数值,遇到运算符就弹出栈顶两个元素即可进行运算,运算完后将结果保存进栈中。
- 最后栈中只会留下一个数值,即为后缀表达式的最终结果。
代码实现:
class Solution
{
public:
int evalRPN(vector<string>& tokens)
{
stack<int> stk;
for(auto& token : tokens)
{
if(token.size() > 1 or isdigit(token[0]))
stk.push(stoi(token));
else
{
int b = stk.top(); stk.pop();
int a = stk.top(); stk.pop();
if(token == "+") a+=b;
else if(token == "-") a-=b;
else if(token == "*") a*=b;
else if(token == "/") a/=b;
stk.push(a);
}
}
return stk.top();
}
};