棧在一些匹配性場景存在巨大優勢,對計算機十分友好
題面
計算逆波蘭式(字尾表示式)的值,整數除法只保留整數部分
運算子僅包含"+","-","*"
和"/"
,被運算元可能是整數或其他表示式
["20", "10", "+", "30", "*"] -> ((20 + 10) * 30) -> 900
["40", "130", "50", "/", "+"] -> (40 + (130 / 50)) -> 42
分析
- 遇到運算元入棧
- 碰到操作符取棧頂兩運算元,計算結果重新入棧
- 注意出棧順序,先進後出,尤其在計算除法與減法時
python 解法
不失短小精悍
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
st = []
for v in tokens:
if v in "+-*/":
b, a = st.pop(),st.pop()
if v == "+": st.append(a + b)
if v == "-": st.append(a - b)
if v == "*": st.append(a * b)
if v == "/": st.append(int(a / b))
else:
st.append(int(v))
return st[-1]
golang實現
效能之王
import "strconv"
func evalRPN(tokens []string) int {
st := []int{}
for _,v := range tokens {
if v == "+" || v == "-" || v == "*" || v == "/" {
if len(st)< 2 {
return 0
}
b := st[len(st)-1]
st = st[:len(st)-1]
a := st[len(st)-1]
st = st[:len(st)-1]
switch v {
case "+": st = append(st, a+b)
case "-": st = append(st, a-b)
case "*": st = append(st, a*b)
case "/": st = append(st, a/b)
}
}else{
if num,err := strconv.Atoi(v); err == nil {
st = append(st, num)
}
}
}
return st[len(st)-1]
}
效能
本作品採用《CC 協議》,轉載必須註明作者和本文連結