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
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP