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;
        }
    }
  • 相关阅读:
    SpringMVC Hello World
    SQL Server存储过程同时返回分页结果集和总数
    C#微信公众号开发--网页授权(oauth2.0)获取用户基本信息二
    C#微信公众号开发--网页授权(oauth2.0)获取用户基本信息一
    C#微信公众号开发--微信事件交互
    C# 微信公众号开发--准备工作
    windows环境redis主从安装部署
    javascript设计模式:策略模式
    Unity3d 屏幕截图。并保存。iOS
    注册消息来判断屏幕是否旋转
  • 原文地址:https://www.cnblogs.com/airwindow/p/4779958.html
Copyright © 2011-2022 走看看