zoukankan      html  css  js  c++  java
  • [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;
        }
    }
  • 相关阅读:
    struts2-dojo-plugin-2.3.1.2.jar!/struts-plugin.xml:29:119
    谈论高并发(十二)分析java.util.concurrent.atomic.AtomicStampedReference看看如何解决源代码CAS的ABA问题
    linux安装QQ
    Android:创建耐磨应用
    僵尸网络
    几个比较好的网站
    几点基于Web日志的Webshell检测思路
    Redis异常JedisConnectionException:Read timed out解决笔记
    ELk 几篇好的文章
    深入了解linux下的last命令及其数据源
  • 原文地址:https://www.cnblogs.com/airwindow/p/4779958.html
Copyright © 2011-2022 走看看