150. Evaluate Reverse Polish Notation
Description
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
Implementation
This problem can be tackled by stack operation. Utilize stack to store operands and when meeting with operation, pop the operands and push the result back into stack. In the end, the top element of the stack is the result we needed.
Be careful about minus like “-1”.
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> operand;
int size = tokens.size();
for(int idx = 0; idx < size; idx++) {
int str_len = tokens[idx].size();
if(str_len == 1 && (tokens[idx] == "+" || tokens[idx] == "-" || tokens[idx] == "*" || tokens[idx] == "/")) {
int op1 = operand.top();
operand.pop();
int op2 = operand.top();
operand.pop();
switch(tokens[idx][0]){
case '+':
operand.push(op1+op2);
break;
case '-':
operand.push(op2-op1);
break;
case '*':
operand.push(op2*op1);
break;
case '/':
operand.push(op2/op1);
break;
default:
break;
}
}
else {
int tmp = 0;
int sign = 1;
if(tokens[idx][0] == '-') sign = -1;
else tmp = tokens[idx][0] - '0';
for(int idx2 = 1; idx2 < str_len; idx2++)
tmp = tmp*10 + tokens[idx][idx2] - '0';
operand.push(tmp*sign);
}
}
if(operand.size() > 0) return operand.top();
else return 0;
}
};