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
思路:
看着挺简单,只要一个栈存数字,遇到运算符就把两个数pop出来,计算后再放进去。
class Solution {
public:
int evalRPN(vector<string> &tokens) {
int size = tokens.size();
stack<int> nums;
int a,b;
for(int i=0;i<size;i++){
if(tokens[i].length()==1){
switch(tokens[i].at(0)){
case '+':
a=nums.top();nums.pop();
b=nums.top();nums.pop();
nums.push(b+a);
break;
case '-':
a=nums.top();nums.pop();
b=nums.top();nums.pop();
nums.push(b-a);
break;
case '*':
a=nums.top();nums.pop();
b=nums.top();nums.pop();
nums.push(b*a);
break;
case '/':
a=nums.top();nums.pop();
b=nums.top();nums.pop();
nums.push(b/a);
break;
default:
a=atoi(tokens[i].c_str());
nums.push(a);
break;
}
}else{
a=atoi(tokens[i].c_str());
nums.push(a);
}
}
return nums.top();
}
};
第一次提交代码时for里面没有if判断的,结果遇到负数的案例出错了,一时没想到更简便的写法,就按上面的提交了。
别人代码:
private static final SetOPERATORS =
new HashSet<>(Arrays.asList("+", "-", "*", "/"));
public int evalRPN(String[] tokens) {
Stack stack = new Stack<>();
for (String token : tokens) {
if (OPERATORS.contains(token)) {
int y = stack.pop();
int x = stack.pop();
stack.push(eval(x, y, token));
} else {
stack.push(Integer.parseInt(token));
}
}
return stack.pop();
}
private int eval(int x, int y, String operator) {
switch (operator) {
case "+": return x + y;
case "-": return x - y;
case "*": return x * y;
default: return x / y;
}
}
ps:
c++想用atoi,需包含cstdlib