题意:
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +, -, *,
/. Each operand may be an integer or another expression.
Some examples:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
解题思路:
由于题目给出的已经是一个求值表达式的后缀式(又称“波兰式”),所以不用我们自己再将
求值表达式转换为后缀式。既然已知后缀式,那求取表达式的值就比较简单了。
步骤:
1.如果当前是操作符,从栈中取出栈顶的两个元素,将其表达式的值入栈.
2.如果当前是数字,直接将其入栈.
3.不断重复上述过程,直到遍历完整个后缀式,最后,栈顶就是所要求的值.
下面是解题代码:
class Solution
{
public:
int evalRPN(vector<string> &tokens)
{
stack<int> stk;
for(unsigned i=0,len=tokens.size();i<len;++i)
{
if(tokens[i].size() == 1 && ( tokens[i][0] < ‘0‘ || tokens[i][0] > ‘9‘))
{
char opt = tokens[i][0] ;
int a , b ;
b = stk.top() , stk.pop();
a = stk.top() , stk.pop();
if(opt == ‘+‘ || opt == ‘-‘)
stk.push(opt == ‘+‘ ? a + b : a - b );
else
stk.push(opt == ‘*‘ ? a * b : a / b );
continue;
}
bool flag = tokens[i][0] == ‘-‘ ;
unsigned j = tokens[i][0] == ‘+‘ || tokens[i][0] == ‘-‘ , len1 = tokens[i].size();
int num = 0 ;
for(;j<len1;++j)
num = num * 10 + tokens[i][j] - ‘0‘ ;
num *= flag ? -1 : 1 ;
stk.push(num);
}
return stk.top();
}
};
注:上述程序是我经过测试后台数据没有类似["-","-9"]这种后缀式的缩写代码,如果后台
存在这种数据,需要另加判断,不过,本质上都是一样的.
LeetCode:Evaluate Reverse Polish Notation,布布扣,bubuko.com
LeetCode:Evaluate Reverse Polish Notation
原文地址:http://blog.csdn.net/dream_you_to_life/article/details/26075627