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:
逆波兰表示法计算机,很简单 ,就是一个stack 由符号弹出计算在填入就行了 最后top上的就是计算的最后的结果。
1 class Solution { 2 public: 3 int evalRPN(vector<string>& tokens) { 4 int sz = tokens.size(); 5 stack<int>result; 6 int leftEval, rightEval; 7 for (int i = 0; i < sz; ++i){ 8 if (tokens[i].size() == 1 && !isdigit(tokens[i][0])){ //处理应该注意,防止出现负数 9 rightEval = result.top(), result.pop(); 10 leftEval = result.top(), result.pop(); 11 switch (tokens[i][0]){ 12 case '+': 13 result.push(leftEval + rightEval); 14 break; 15 case '-': 16 result.push(leftEval - rightEval); 17 break; 18 case '*': 19 result.push(leftEval * rightEval); 20 break; 21 case '/': 22 result.push(leftEval / rightEval); 23 break; 24 default: 25 break; 26 } 27 } 28 else{ 29 if (tokens[i][0] == '-'){ 30 result.push(0 - atoi(tokens[i].substr(1, tokens[i].size() - 1).c_str())); 31 cout << result.top(); 32 } 33 else 34 result.push(atoi(tokens[i].c_str())); 35 } 36 } 37 return result.top(); 38 } 39 };
java版本的方法具体的和上面的差不多,但是java的栈的api用起来确确实实的要容易很多,代码如下所示:
1 public class Solution { 2 public int evalRPN(String[] tokens) { 3 Stack<Integer> s = new Stack<Integer>(); 4 for(int i = 0; i < tokens.length; i++){ 5 if(isDigit(tokens[i])){ 6 s.push(Integer.parseInt(tokens[i])); 7 }else{ 8 int right = s.pop();//分别是左右操作数 9 int left = s.pop(); 10 switch(tokens[i].charAt(0)){ 11 case '+': 12 s.push(left + right); 13 break; 14 case '-': 15 s.push(left - right); 16 break; 17 case '*': 18 s.push(left * right); 19 break; 20 case '/': 21 s.push(left / right); 22 break; 23 } 24 } 25 } 26 return s.pop(); 27 } 28 29 public boolean isDigit(String str){ 30 return Character.isDigit(str.charAt(0))||(str.length() > 1);//防止出现-1这种特殊的数字也需要正确的判断 31 } 32 }