https://leetcode.com/problems/evaluate-reverse-polish-notation/description/

其實題目蠻簡單的,大家應該都能寫出類似的邏輯:

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        operators = ['+', '-', '*', '/']
        stack = []
        for token in tokens:
            if token not in operators:
                stack.append(int(token))
            else:
                match token:
                    case '+':
                        s = stack.pop()
                        f = stack.pop()
                        stack.append(f + s)
                    case '-':
                        s = stack.pop()
                        f = stack.pop()
                        stack.append(f - s)
                    case '*':
                        s = stack.pop()
                        f = stack.pop()
                        stack.append(f * s)
                    case '/':
                        s = stack.pop()
                        f = stack.pop()
                        stack.append(int(f / s))
 
        return stack.pop()

但應該可以更善用 Python 的特性才對,請大哥幫我校對了一下:

  1. 可以改成 s, f = stack.pop(), stack.pop()
  2. 可以改成用字典加 lambda 來代替 match
class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        operators = {
            '+': lambda a, b: int(a + b),
            '-': lambda a, b: int(a - b),
            '*': lambda a, b: int(a * b),
            '/': lambda a, b: int(a / b)
        }
        stack = []
        
        for token in tokens:
            if token not in operators:
                stack.append(int(token))
            else:
                s, f = stack.pop(), stack.pop()
                stack.append(operators[token](f, s))
 
        return stack.pop()

好耶,是說感覺對 lambda 超級不熟的,也覺得自己對程式的理解只停留在非常非常基礎的 C 語法 …