Evaluate Reverse Polish Notation
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
该题为逆波兰式求值,算法比较简单。用栈保存数字,遇到数字入栈,遇到运算符栈顶两元素出栈求值,结果再入栈,最后栈顶元素就是结果。 但是写起来比较费事,可以这样写:
int evalRPN(vector<string>& tokens) {
stack<int> nums;
int result, t1, t2;
for (auto t : tokens) {
if (t == "+") {
t1 = nums.top(); nums.pop();
t2 = nums.top(); nums.pop();
nums.push(t2 + t1);
} else if (t == "-") {
t1 = nums.top(); nums.pop();
t2 = nums.top(); nums.pop();
nums.push(t2 - t1);
} else if (t == "*") {
t1 = nums.top(); nums.pop();
t2 = nums.top(); nums.pop();
nums.push(t2 * t1);
} else if (t == "/") {
t1 = nums.top(); nums.pop();
t2 = nums.top(); nums.pop();
nums.push(t2 / t1);
} else {
nums.push(stoi(t));
}
}
return nums.top();
}
也可以使用c++11的function, 如下:
int evalRPN(vector<string>& tokens) {
stack<int> nums;
unordered_map<string, function<int(int, int)>> operators = {
{"+", std::plus<int>() },
{ "-", std::minus<int>() },
{ "*", std::multiplies<int>() },
{ "/", std::divides<int>() }
};
int result, t1, t2;
for (auto t : tokens) {
if (operators.count(t)) {
t1 = nums.top(); nums.pop();
t2 = nums.top(); nums.pop();
nums.push(operators[t](t2, t1));
} else {
nums.push(stoi(t));
}
}
return nums.top();
}
是不是简单很多。