150. Evaluate Reverse Polish Notation

题目:

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

链接: http://leetcode.com/problems/evaluate-reverse-polish-notation/

题解:

求解逆波兰式。第一次听这个还是很久以前从老殷的口中。 典型的栈应用。计算结果然后push回栈里就可以了。ac的代码很简单,其实还应该加入很多检查,比如pop之前检查stack是否为空, parseInt之前检查是否可以被parse - 写一个tryParseInt的boolean方法。以后要继续注意细节。

Time Complexity - O(n),Space Complexity - O(n)

public class Solution {
    public int evalRPN(String[] tokens) {
        if(tokens == null || tokens.length == 0)
            return 0;
        Stack<Integer> stack = new Stack<>();
        
        for(int i = 0; i < tokens.length; i++) {
            String token = tokens[i];
            if(token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/")) {
                int post = stack.pop();
                int prev = stack.pop();
                if(token.equals("+"))
                    stack.push(prev + post);
                else if (token.equals("-"))
                    stack.push(prev - post);
                else if (token.equals("*"))
                    stack.push(prev * post);
                else
                    if(post == 0)
                        return 0;
                    else
                        stack.push(prev / post);
            } else
                stack.push(Integer.parseInt(token));
        }
        
        return stack.pop();
    }
}

 

题外话: 第一遍刷题基本完成了一遍,后面就是新世界了。完成第一遍之后还要有第2,3,4,5遍,以及要补充许多其他知识,学习Python和JavaScript。努力吧。

 

二刷:

方法和一刷一样,就是使用一个Stack<Integer>来保存临时结果。在token等于数字的话直接push入栈。 在token等于符号的时候分别进行计算,之后再把结果push入栈。

要注意计算的时候 parseInt返回的是int, valueOf返回的是Integer,这之间有个auto boxing 和unboxing。 假如有exception的话可以加try catch来throw new Runtime Exception。

更好的写法是用一个switch语句,并且用int[] 数组来cache之前的结果。

Java:

Time Complexity - O(n),Space Complexity - O(n)

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

 

 

Reference:

https://leetcode.com/discuss/6266/java-accepted-code-stack-implementation

https://leetcode.com/discuss/44526/accepted-clean-java-solution

https://leetcode.com/discuss/89741/7ms-java-solution-beat-99-39%25

posted @ 2015-05-09 11:52  YRB  阅读(394)  评论(0编辑  收藏  举报