zoukankan      html  css  js  c++  java
  • 0150. Evaluate Reverse Polish Notation (M)

    Evaluate Reverse Polish Notation (M)

    题目

    Evaluate the value of an arithmetic expression in Reverse Polish Notation.

    Valid operators are +, -, *, /. Each operand may be an integer or another expression.

    Note:

    • Division between two integers should truncate toward zero.
    • The given RPN expression is always valid. That means the expression would always evaluate to a result and there won't be any divide by zero operation.

    Example 1:

    Input: ["2", "1", "+", "3", "*"]
    Output: 9
    Explanation: ((2 + 1) * 3) = 9
    

    Example 2:

    Input: ["4", "13", "5", "/", "+"]
    Output: 6
    Explanation: (4 + (13 / 5)) = 6
    

    Example 3:

    Input: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
    Output: 22
    Explanation: 
      ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
    = ((10 * (6 / (12 * -11))) + 17) + 5
    = ((10 * (6 / -132)) + 17) + 5
    = ((10 * 0) + 17) + 5
    = (0 + 17) + 5
    = 17 + 5
    = 22
    

    题意

    计算逆波兰表达式(即后缀表达式)的值。

    思路

    遇到数字就压栈;遇到符号则从栈中弹出两个数字进行运算(注意后出栈的在前,先出栈的在后),将得到的结果再压入栈中;最后栈中只剩一个数,即所求结果。


    代码实现

    Java

    class Solution {
        public int evalRPN(String[] tokens) {
            Deque<Integer> stack = new ArrayDeque<>();
    
            for (String token : tokens) {
                if (token.equals("+")) {
                    int y = stack.pop(), x = stack.pop();
                    stack.push(x + y);
                } else if (token.equals("-")) {
                    int y = stack.pop(), x = stack.pop();
                    stack.push(x - y);
                } else if (token.equals("*")) {
                    int y = stack.pop(), x = stack.pop();
                    stack.push(x * y);
                } else if (token.equals("/")) {
                    int y = stack.pop(), x = stack.pop();
                    stack.push(x / y);
                } else {
                    stack.push(Integer.parseInt(token));
                }
            }
    
            return stack.pop();
        }
    }
    

    JavaScript

    /**
     * @param {string[]} tokens
     * @return {number}
     */
    var evalRPN = function (tokens) {
      const stack = []
    
      for (const token of tokens) {
        if (!isNaN(token)) {
          stack.push(+token)
        } else {
          const b = stack.pop()
          const a = stack.pop()
          if (token === '+') stack.push(a + b)
          else if (token === '-') stack.push(a - b)
          else if (token === '*') stack.push(a * b)
          else stack.push(Math.trunc(a / b))
        }
      }
    
      return stack.pop()
    }
    
  • 相关阅读:
    allocation size overflow
    数据库隔离级别深入理解(ORACLE)
    查看Orcale数据里的表是否有变化
    意外发现抽象类的构造器
    C语言学习快速笔记
    由javascript的闭包引申到程序语言编译上的自由变量作用域的考量
    easyui的datagrid的列checkbox自定义增加disabled选项
    数据库连接不关闭造成的问题以及RowSet的使用
    Quartz的JobDetail没有触发器指向时会被删除的问题
    发现浏览器开发工具的一个小问题
  • 原文地址:https://www.cnblogs.com/mapoos/p/14811235.html
Copyright © 2011-2022 走看看