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
分析
逆波兰表达式是典型的递归结构,所以可以用递归来求解,也可以用栈来求解。
递归版
// Evaluate Reverse Polish Notation
// 递归,时间复杂度O(n),空间复杂度O(logn)
class Solution {
public:
int evalRPN(vector &tokens) {
if (tokens.empty()) return 0;
int x, y;
auto token = tokens.back(); tokens.pop_back();
if (is_operator(token)) {
y = evalRPN(tokens);
x = evalRPN(tokens);
switch(token[0]) {
case '+' : x += y; break;
case '-' : x -= y; break;
case '*' : x *= y; break;
default: x /= y;
}
} else {
size_t i;
x = stoi(token, &i);
}
return x;
}
private:
bool is_operator(const string &op) {
return op.size() == 1 && string("+-*/").find(op) != string::npos;
}
};
迭代版
// Max Points on a Line
// 迭代,时间复杂度O(n),空间复杂度O(logn)
class Solution {
public:
int evalRPN(vector<string> &tokens) {
stack<string> s;
for (auto token : tokens) {
if (!is_operator(token)) {
s.push(token);
} else {
int y = stoi(s.top());
s.pop();
int x = stoi(s.top());
s.pop();
switch(token[0]) {
case '+' : x += y; break;
case '-' : x -= y; break;
case '*' : x *= y; break;
default: x /= y;
}
s.push(to_string(x));
}
}
return stoi(s.top());
}
private:
bool is_operator(const string &op) {
return op.size() == 1 && string("+-*/").find(op) != string::npos;
}
};