Time:2019/4/14
Title: Evaluate Reverse Polish Notation
Difficulty: Medium
Author:小鹿
javascript
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
根據逆波蘭表示法,求表達式的值。算法
有效的運算符包括
+
,-
,*
,/
。每一個運算對象能夠是整數,也能夠是另外一個逆波蘭表達式。express說明:編程
- 整數除法只保留整數部分。
- 給定逆波蘭表達式老是有效的。換句話說,表達式總會得出有效數值且不存在除數爲 0 的狀況。
Example 1:數組
Input: ["2", "1", "+", "3", "*"]
Output: 9
Explanation: ((2 + 1) * 3) = 9
複製代碼
Example 2:bash
Input: ["4", "13", "5", "/", "+"]
Output: 6
Explanation: (4 + (13 / 5)) = 6
複製代碼
Example 3:ide
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
複製代碼
仔細觀察上述的逆波蘭表達式,能夠發現一個規律就是每遇到一個操做符,就將操做符前的兩個操做數進行運算,將結果保存到原位置。
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/luxiangqiang/JS-LeetCode 歡迎關注我我的公衆號:「一個不甘平凡的碼農」,記錄了本身一路自學編程的故事。