[LeetCode#150]Evaluate Reverse Polish Notation

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:

Reference: 
https://en.wikipedia.org/wiki/Reverse_Polish_notation
After reading the wiki page of the RPN, you could find out this problem is super easy!!!!
But I still stupidly make A mistake!!!
-----------------------------------------------------------------------------------------
Mistake 1:
Forget to take care of the order, when numbers were poped out from stack. 
|num2|
|num1|
Note: num2 was poped before num1!!!
For an oprand (+,-,*,/), we hope num1 (operand) num2

I ingore the order at first, thus I have implemented following wrong codes:
if (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/")) {
    int num1 = Integer.valueOf(stack.pop());
    int num2 = Integer.valueOf(stack.pop());
    int num3 = compute(num1, num2, token);
    ...
}
And it results in following error:
Input:
["4","3","-"]
Output:
-1
Expected:

Fix:
if (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/")) {
    int num1 = Integer.valueOf(stack.pop());
    int num2 = Integer.valueOf(stack.pop());
    int num3 = compute(num2, num1, token);
    ...
}

Solution:

public class Solution {
    public int evalRPN(String[] tokens) {
        if (tokens == null)
            throw new IllegalArgumentException("The passed in tokens array in null");
        if (tokens.length == 0)
            return 0;
        Stack<Integer> stack = new Stack<Integer> ();
        for (String token : tokens) {
            if (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/")) {
                int num1 = Integer.valueOf(stack.pop());
                int num2 = Integer.valueOf(stack.pop());
                int num3 = compute(num2, num1, token);
                stack.push(num3);
            } else{
                int num = Integer.valueOf(token);
                stack.push(num);
            }
        }
        return stack.pop();
    }
    
    private int compute(int num1, int num2, String token) {
        int res = 0;
        switch (token) {
            case "+" :
                res = num1 + num2;
                break;
            case "-" :
                res = num1 - num2;
                break;
            case "*" :
                res = num1 * num2;
                break;
            case "/" :
                res = num1 / num2;
                break;
        }
        return res;
    }
}

 

posted @ 2015-09-03 10:21  airforce  阅读(150)  评论(0编辑  收藏  举报