Problem:
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
Analysis:
Solutions:
C++:
int SToI(const string& str)
{
bool is_neg = false;
if(str[0] == '-')
is_neg = true;
int r_abs = 0;
for(int i = (is_neg ? 1 : 0); i < str.size(); ++i) {
r_abs *= 10;
r_abs += str[i] - '0';
}
return (is_neg ? -1 : 1) * r_abs;
}
int evalRPN(vector<string>& tokens)
{
if(tokens.empty())
return 0;
stack<int> cached_values;
for(int i = 0; i < tokens.size(); ++i) {
if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
int right = cached_values.top();
cached_values.pop();
int left = cached_values.top();
cached_values.pop();
if(tokens[i] == "+")
cached_values.push(left + right);
else if(tokens[i] == "-")
cached_values.push(left - right);
else if(tokens[i] == "*")
cached_values.push(left * right);
else if(tokens[i] == "/")
cached_values.push(left / right);
} else {
cached_values.push(SToI(tokens[i]));
}
}
return cached_values.top();
}
Java
:
Python: