LeetCode 之 JavaScript 解答第150题 —— 逆波兰表达式求值

Time:2019/4/14
Title: Evaluate Reverse Polish Notation
Difficulty: Medium
Author:小鹿

问题:Evaluate Reverse Polish Notation

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.

依据逆波兰示意法,求表达式的值。

有用的运算符包含 +, -, *, / 。每一个运算对象可所以整数,也可所以另一个逆波兰表达式。

申明:

  • 整数除法只保存整数部份。
  • 给定逆波兰表达式老是有用的。换句话说,表达式总会得出有用数值且不存在除数为 0 的状况。

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

Solve:

▉ 算法思绪

仔细观察上述的逆波兰表达式,能够发明一个规律就是每碰到一个操纵符,就将操纵符前的两个操纵数举行运算,将效果保存到原位置。

1)我们能够将这个历程用栈来举行操纵。

2)一切的操纵数都实行近栈操纵,当碰到操纵符时,在栈中掏出两个操纵数举行盘算,然后再将其压入栈内,继承遍历数组元素,直到遍历完全个数组为止。

3)到末了,栈内只剩下一个数,那就是末了的效果。

▉ 注重事项

虽然历程很好明白,代码写起来很简单,然则想把算法写的周全照样须要考虑到许多方面的。

1)数组中的是字符串范例,要举行数据范例转换 parseInt()

2)两个操纵数举行运算时,第二个出栈的操纵数在前,第一个出栈的操纵数在后(注重除法)。

3)关于浮点型数据,只取小数点之前的整数。

4)关于负的浮点型(尤其是 0 点几 ),要取 0 绝对值 0 ,或直接转化为整数。

▉ 代码完成
var evalRPN = function(tokens) {
   // 声明栈
    let stack = [];
    for(let item of tokens){
        switch(item){
            case '+':
                let a1 = stack.pop();
                let b1 = stack.pop();
                stack.push(b1 + a1);
                break;
            case '-':
                let a2 = stack.pop();
                let b2 = stack.pop();
                stack.push(b2 - a2);
                break;
            case '*':
                let a3 = stack.pop();
                let b3 = stack.pop();
                stack.push(b3 * a3);
                break;
            case '/':
                let a4 = stack.pop();
                let b4 = stack.pop();
                stack.push(parseInt(b4 / a4));
                break;
            default: 
                stack.push(parseInt(item));
        }
    }
    return parseInt(stack.pop());
};

迎接一同加入到 LeetCode 开源 Github 堆栈,能够向 me 提交您其他言语的代码。在堆栈上对峙和小伙伴们一同打卡,配合完美我们的开源小堆栈!
Github:https://github.com/luxiangqia…

    原文作者:小鹿
    原文地址: https://segmentfault.com/a/1190000018875981
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞