Python 中如何編寫程式來評估字串中的布林表示式?


假設我們有一個包含布林表示式的字串 s,其中包含運算子“and”和“or”,評估它並返回結果。這裡的表示式可能包含括號,應優先評估。

因此,如果輸入類似於 s = "T and (F or T)",則輸出將為 True

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

  • stack := 一個新的列表

  • t = s 中以空格分隔的元素的列表

  • 對於 t 中的每個 v,執行以下操作:

    • 如果 v[0] 與 "(" 相同,則

      • 當 v[從 "(" 的索引到末尾] 與 "T" 相同時,將 true 推入堆疊

    • 否則,當找到 ")" 時,則

      • ct := v 中 ")" 的數量

      • 當 v[從索引 0 到 v 的大小 - ct] 與 "T" 相同時,將 true 推入堆疊

      • 對於 ct-1 範圍內的每個值,執行以下操作:

        • right := 從堆疊中彈出

  • := 從堆疊中彈出

    • left := 從堆疊中彈出

    • 執行操作 (left o right) 並將其推入堆疊

    • 否則,當 v 為 "T" 或 "F" 時,則

      • 當 v 與 "T" 相同時,將 true 推入堆疊

    • 否則,

      • 將 op[v] 推入堆疊

  • 如果堆疊中的元素數量 > 1,則

    • 對於 0 到堆疊大小 - 1 的 i 範圍,以 2 為增量,執行以下操作:

      • stack[i + 2] := stack[i + 1](stack[i], stack[i + 2])

    • 返回堆疊的頂部元素

  • 返回堆疊的底部元素

讓我們檢視以下實現以更好地理解

示例

 即時演示

class Solution:
   def solve(self, s):
      stack = []
      op = {
         "or": lambda x, y: x or y,
         "and": lambda x, y: x and y,
      }
      for v in s.split():
         if v[0] == "(":
            stack.append(v[v.count("(") :] == "T")
         elif v.count(")") > 0:
            ct = v.count(")")
            stack.append(v[:-ct] == "T")
            for _ in range(ct):
               right = stack.pop()
               o = stack.pop()
               left = stack.pop()
               stack.append(o(left, right))
         elif v in ["T", "F"]:
            stack.append(v == "T")
         else:
            stack.append(op[v])

      if len(stack) > 1:
         for i in range(0, len(stack) - 1, 2):
            stack[i + 2] = stack[i + 1](stack[i], stack[i + 2])
         return stack[-1]

      return stack[0]

ob = Solution()
s = "T and (F or T)"
print(ob.solve(s))

輸入

"T and (F or T)"

輸出

True

更新於: 2020年11月10日

752 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告