天天看點

leetcode(力扣) 150. 逆波蘭表達式求值 (棧的運用)

文章目錄

  • ​​題目描述​​
  • ​​思路分析​​
  • ​​完整代碼​​

題目描述

根據 ​​逆波蘭表示法​​​,求表達式的值。

有效的算符包括 +、-、*、/ 。每個運算對象可以是整數,也可以是另一個逆波蘭表達式。

注意 兩個整數之間的除法隻保留整數部分。

可以保證給定的逆波蘭表達式總是有效的。換句話說,表達式總會得出有效數值且不存在除數為 0 的情況。

示例 1:

輸入:tokens = [“2”,“1”,“+”,“3”,“*”]

輸出:9

解釋:該算式轉化為常見的中綴算術表達式為:((2 + 1) * 3) = 9

示例 2:

輸入:tokens = [“4”,“13”,“5”,“/”,“+”]

輸出:6

解釋:該算式轉化為常見的中綴算術表達式為:(4 + (13 / 5)) = 6

示例 3:

輸入:tokens = [“10”,“6”,“9”,“3”,“+”,“-11”,““,”/“,””,“17”,“+”,“5”,“+”]

輸出:22

解釋:該算式轉化為常見的中綴算術表達式為:

((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,

tokens = [“2”,“1”,“+”,“3”,“*”]

建立棧stack = []

遇到數字就進棧, 遇到計算符就計算倒數第二個和倒數第一個之間的數值結果,然後将該結果進棧。

  • 遇到2進棧,遇到1進棧。 此時棧裡 stack = [2,1]
  • 遇到 ‘+’ 号計算符 将前兩個出棧 做加運算,2+1=3
  • 将計算結果進棧 此時棧裡 stack = [3]
  • 在遇到3 進棧 此時棧裡 stack = [3,3]
  • 遇到 ‘*’ 取出棧裡的 3 * 3 = 9 ,在進棧 stack = [9]

完整代碼

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
            stack = []
            for i in tokens:
                if i == '+':
                    stack.append(int(stack.pop()) + int(stack.pop()))
                elif i == '-':
                    temp = int(stack[-2]) - int(stack[-1])
                    stack.pop()
                    stack.pop()
                    stack.append(temp)
                elif i == '*':
                    stack.append(int(stack.pop()) * int(stack.pop()))
                elif i == '/':
                    stack.append(1/int(stack.pop()) * int(stack.pop()))
                else:
                    stack.append(i)
            return int(stack[0])