• 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()
    }
    
  • 相关阅读:
    工作中碰到的小问题记录
    MySQL之路 ——1、安装跳坑
    C# 构造函数
    C# 操作文件类,文件夹存在判断,创建,文件内容读写。
    你为什么(不)用存储过程?
    C#基础巩固之基础类型
    mysql存储过程中使用事务
    Redis 安装
    Maven 国内映像
    mysql存储过程详解
  • 原文地址:https://www.cnblogs.com/mapoos/p/14811235.html
Copyright © 2020-2023  润新知