逆波蘭表示式求值 golang VS python

pardon110發表於2020-10-15

棧在一些匹配性場景存在巨大優勢,對計算機十分友好

題面

計算逆波蘭式(字尾表示式)的值,整數除法只保留整數部分
運算子僅包含"+","-","*""/",被運算元可能是整數或其他表示式

["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]
}

效能

提交時間 提交結果 執行時間 記憶體消耗 語言
幾秒前 通過 4 ms 4.1 MB Go
幾秒前 通過 44 ms 13.7 MB Python3
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章