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
逆波兰表达式计算。教科书
我的代码
class Solution {
public:
int evalRPN(vector<string>& tokens) {
int res=0;
stack<int> s;
int result=0;
for(auto str:tokens)
{
if(str=="+"||str=="-"||str=="*"||str=="/")
{
int last=s.top();
s.pop();
int first=s.top();
s.pop();
if(str=="+")
s.push(first+last);
else if(str=="-")
s.push(first-last);
else if(str=="*")
s.push(first*last);
else
s.push(first/last);
}
else s.push(stoi(str));
}
return s.top();
}
};
其他比较好的解法:
使用lambda表达式、函数子构建加减乘除map对应关系
class Solution {
public:
int evalRPN(vector<string>& tokens) {
unordered_map<string, function<int (int, int) > > map = {
{ "+" , [] (int a, int b) { return a + b; } },
{ "-" , [] (int a, int b) { return a - b; } },
{ "*" , [] (int a, int b) { return a * b; } },
{ "/" , [] (int a, int b) { return a / b; } }
};
std::stack<int> stack;
for (string& s : tokens) {
if (!map.count(s)) {
stack.push(stoi(s));
} else {
int op1 = stack.top();
stack.pop();
int op2 = stack.top();
stack.pop();
stack.push(map[s](op2, op1));
}
}
return stack.top();
}
};