Python字串S表示式求值程式


假設我們有一個字串s作為S表示式。我們必須對該S表示式進行求值,並將結果作為整數返回。眾所周知,s表示式是一個表示式,它可以是一個數字,也可以是一個用括號括起來的遞迴表示式,例如(+ (- 3 2) (* 3 3)),表示(3 - 2) + (3 * 3) = 10。這裡有效的運算子是+、-、*和/。

因此,如果輸入類似於s = "(- (+ 3 2) 2)",則輸出將為3,因為((3 + 2) - 2) = 3。

為了解決這個問題,我們將遵循以下步驟:

  • stack := 新建一個棧

  • 移除s的開頭和結尾括號

  • a := 使用空格分割s,並建立一個分割槽列表

  • 對於a中的每個i,按逆序執行:

    • 如果i的長度> 1,則:

      • 如果i[0]與"-"相同,則:

        • 將i作為整數壓入棧

        • 進行下一次迭代

      • 否則:

        • 將i作為整數壓入棧

    • 如果i是一個數字,則:

      • 將i作為整數壓入棧

    • 否則:

      • 如果棧的大小>= 2,則:

        • num1 := 從棧中彈出

        • num2 := 從棧中彈出

        • 如果i與"+"相同,則:

          • 執行num1 + num2並將結果壓入棧

        • 如果i與"-"相同,則:

          • 執行num1 - num2並將結果壓入棧

        • 如果i與"*"相同,則:

          • 執行num1 * num2並將結果壓入棧

        • 否則:

          • 執行num1 / num2並將結果壓入棧

  • 返回棧頂元素,並移除棧頂元素

示例

讓我們來看下面的實現來更好地理解:

線上演示

class Solution:
   def solve(self, s):
      stack = list()
      s = s.replace("(", "")
      s = s.replace(")", "")
      a = s.split()
      for i in a[::-1]:
         if len(i) > 1:
            if i[0] == "-":
               stack.append(int(i))
               continue
            else:
               stack.append(int(i))
         elif i.isdigit():
            stack.append(int(i))
         else:
            if len(stack) >= 2:
               num1 = stack.pop()
               num2 = stack.pop()
               if i == "+":
                  stack.append(int(num1 + num2))
               elif i == "-":
                  stack.append(int(num1 - num2))
               elif i == "*":
                  stack.append(int(num1 * num2))
               else:
                  stack.append(int(num1 / num2))
      return stack.pop()
ob = Solution()
s = "(- (+ 3 2) 2)"
print(ob.solve(s))

輸入

s = "(- (+ 3 2) 2)"

輸出

3

更新於:2020年12月22日

442 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.