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
廣告