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

 

 就是求逆波兰表达式(后续遍历)的结果。

1、直接求解,很慢

public class Solution {
    public int evalRPN(String[] tokens) {
        
        int len = tokens.length;
        if( len == 0)
            return 0;
        for( int i = 0 ; i < len ; i ++ ){
            
            if( tokens[i].equals("+") )
                helper(tokens,i,1);
            else if( tokens[i].equals("-") )
                helper(tokens,i,2);
            else if( tokens[i].equals("*") )
                helper(tokens,i,3);
            else if( tokens[i].equals("/") )
                helper(tokens,i,4);
        }
        return Integer.valueOf(tokens[0]);
    }
    public void helper(String[] tokens,int pos,int type){
        int pos1 = -1,pos2 = 0 ;
        tokens[pos] = null;
        while( pos >= 0 ){
            if( tokens[pos] != null){
                if( pos1 == -1)
                    pos1 = pos;
                else{
                    pos2 = pos;
                    break;
                }
            }
            pos--;
        }
        int num1 = Integer.valueOf(tokens[pos1]);
        int num2 = Integer.valueOf(tokens[pos2]);
        if( type == 1){
            tokens[pos2] = String.valueOf(num1+num2);
        }else if( type == 2){
            tokens[pos2] = String.valueOf(num2-num1);
        }else if( type == 3){
            tokens[pos2] = String.valueOf(num2*num1);
        }else if( type == 4){
            tokens[pos2] = String.valueOf(num2/num1);
        }
        tokens[pos1] = null;
    } 
    
}

 

 

2、使用栈,很简单。

public class Solution {
    public int evalRPN(String[] tokens) {
        
        int len = tokens.length;
        
        if( len == 0)
            return 0;
        Stack<Integer> stack = new Stack<Integer>();
        for( int i = 0 ; i < len ; i ++ ){
            
            if( tokens[i].equals("+") ){
                int num1 = stack.pop();
                int num2 = stack.pop();
                stack.push(num1+num2);
            }
            else if( tokens[i].equals("-") ){
                int num1 = stack.pop();
                int num2 = stack.pop();
                stack.push(num2-num1);
            }
            else if( tokens[i].equals("*") ){
                int num1 = stack.pop();
                int num2 = stack.pop();
                stack.push(num1*num2);
            }
            else if( tokens[i].equals("/") ){
                int num1 = stack.pop();
                int num2 = stack.pop();
                stack.push(num2/+num1);
                
            }else{
                stack.push(Integer.valueOf(tokens[i]));
            }

        }
        return stack.pop();
    }
    
    
}