快轉到主要內容
  1. LeetCode/

LeetCode 150: Evaluate Reverse Polish Notation

·1 分鐘· ·
LeetCode Daily Medium Stack Expression-Evaluation Reverse-Polish-Notation Postfix-Notation Mathematics Algorithm Data-Structure 逆波蘭表示法 堆疊 表達式求值 數學 演算法
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: Medium
第一次嘗試: 2025-08-10
總花費時間: 00:00.00
分類: 堆疊、表達式求值、數學
相關主題: 逆波蘭表示法、後綴表示法、數學運算、堆疊操作

解題思路
#

這是一個經典的堆疊問題,用於求值逆波蘭表示法(RPN)。關鍵洞察是 RPN 通過將運算符放在運算數之後來消除對括號的需求。我們使用堆疊來追蹤數字,當遇到運算符時,我們彈出頂部的兩個數字,執行運算,並將結果推回堆疊。記住在計算和返回結果時要處理資料類型轉換。

解法
#

使用堆疊進行 RPN 求值
#

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for token in tokens:
            if token in "+-*/":
                num1 = int(stack.pop())
                num2 = int(stack.pop())
                if token == "+":
                    stack.append(num1 + num2)
                elif token == "-":
                    stack.append(num2 - num1)
                elif token == "*":
                    stack.append(num2 * num1)
                else:
                    stack.append(num2 / num1)
            else:
                stack.append(token)

        return int(stack[-1])

時間複雜度: O(n) 其中 n 是 tokens 陣列的長度
空間複雜度: O(n) 用於堆疊的最壞情況

關鍵洞察
#

  1. 堆疊 LIFO 特性: 最後推入堆疊的兩個數字是下一個運算的運算數
  2. 運算符順序: 當遇到運算符時,我們彈出頂部的兩個數字並執行運算
  3. 資料類型處理: 在執行計算時始終將 tokens 轉換為整數
  4. 結果轉換: 最終結果應該轉換回整數

收穫
#

  • 堆疊方法非常適合涉及表達式求值和數學運算的問題
  • RPN 消除了對括號和運算符優先級規則的需求
  • 時間複雜度在 O(n) 是最佳的,因為我們只需要遍歷 tokens 一次
  • 這個問題展示了堆疊如何用於高效求值數學表達式

遇到的問題
#

  • 最初難以理解執行減法和除法時運算數的順序
  • 必須思考堆疊順序以及如何正確處理運算數
  • 在視覺化每個運算符如何處理頂部兩個數字後,堆疊方法變得清晰
  • 理解堆疊的 LIFO 特性對於正確的運算數順序至關重要

相關文章

LeetCode 739: Daily Temperatures
·1 分鐘
LeetCode Daily Medium Stack Monotonic-Stack Array Temperature Waiting-Time Algorithm Data-Structure 溫度 堆疊 陣列 等待時間 演算法
使用單調堆疊解決每日溫度問題
LeetCode 20: Valid Parentheses
·1 分鐘
LeetCode Daily Easy Stack String Parentheses Validation Algorithm Data-Structure 括號 堆疊 字串 驗證 演算法
使用堆疊解決有效括號問題
LeetCode 901: Online Stock Span
·1 分鐘
LeetCode Daily Medium Stack Monotonic-Stack Design Data-Structure Algorithm 股票 堆疊 設計模式
使用單調堆疊解決股票價格跨度問題
LeetCode 84: Largest Rectangle in Histogram
·1 分鐘
LeetCode Daily Hard Stack Monotonic-Stack Array Histogram Geometry Algorithm Dynamic-Programming 直方圖 堆疊 幾何 演算法
使用單調堆疊解決直方圖中最大矩形面積問題
LeetCode 155: Min Stack
·1 分鐘
LeetCode Daily Medium Stack Design Data-Structure Tuple Constant-Time 堆疊 設計 資料結構 元組 常數時間
使用元組方法實現具有 O(1) 最小值檢索的堆疊
LeetCode 853: Car Fleet
·1 分鐘
LeetCode Daily Medium Stack Sorting Simulation Greedy Array 堆疊 排序 模擬 貪心 陣列
使用堆疊方法解決車隊問題