• [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;
        }
    }
  • 相关阅读:
    判断大文件是否上传成功(一个大文件上传到ftp,判断是否上传完成)
    hbase的region
    把hdfs数据写入到hbase表
    eclipse和scala整合,打包配置文件及打包步骤
    sparkStreaming 读kafka的数据
    脚本put数据到hdfs
    Hive的自定义函数
    Ftp客户端需要TSL功能的文件上传
    Hive中的数据库、表、数据与HDFS的对应关系
    一文了解RPC框架原理
  • 原文地址:https://www.cnblogs.com/airwindow/p/4779958.html
Copyright © 2020-2023  润新知