LeetCode 之 JavaScript 解答第150題 —— 逆波蘭表達式求值


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


題目:Evaluate Reverse Polish Notation

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

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

Note:github

  • 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.

根據逆波蘭表示法,求表達式的值。算法

有效的運算符包括 +, -, *, / 。每一個運算對象能夠是整數,也能夠是另外一個逆波蘭表達式。express

說明:數組

  • 整數除法只保留整數部分。
  • 給定逆波蘭表達式老是有效的。換句話說,表達式總會得出有效數值且不存在除數爲 0 的狀況。

Example 1:ide

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

Example 2:lua

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

Example 3:code

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...

相關文章
相關標籤/搜索