根据 逆波兰表示法,求该后缀表达式的计算结果。
有效的算符包括 +
、-
、*
、/
。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
- 整数除法只保留整数部分。
- 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 1:
输入:tokens = ["2","1","+","3","*"] 输出:9 解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:
输入:tokens = ["4","13","5","/","+"] 输出:6 解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
思路:计算后缀表达式的结果,从左到右开始,元素为数字则保留,运算符则需要找到前两个元素进行运算再将结果保留。
代码实现:典型需要用栈的列题。
数字可能是负数如-11等需要特殊判断。
字符串和整数的互相转换,可参考to_string()和atoi()函数。
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> s;
for(int i=0;i<tokens.size();i++)
{
if(tokens[i][0]>='0'&&tokens[i][0]<='9')
{
int temp=atoi(tokens[i].c_str());
s.push(temp);
}
else if(tokens[i][0]=='-'&&tokens[i].size()>1)
{
int temp=atoi(tokens[i].c_str());
s.push(temp);
}
else
{
int a=s.top();
s.pop();
int b=s.top();
s.pop();
switch(tokens[i][0]){
case '*':
s.push(a*b);
break;
case '/':
s.push(b/a);
break;
case '+':
s.push(a+b);
break;
case '-':
s.push(b-a);
break;
}
}
}
return s.top();
}
};