Python中布林表示式的解析
假設我們有一個布林表示式,我們需要找到評估該表示式後的結果。
表示式可以是:
"t",評估結果為True;
"f",評估結果為False;
"!(expression)",評估結果為內部表示式的邏輯非;
"&(expr1,expr2,...)",評估結果為兩個或多個內部表示式的邏輯與;
"|(expr1,expr2,...)",評估結果為兩個或多個內部表示式的邏輯或;
因此,如果輸入類似於"|(!(t),&(t,f,t))",則輸出將為false,這是因為!(t)為false,&(t,f,t)也為false,所以所有false值的或運算結果為false。
為了解決這個問題,我們將遵循以下步驟:
定義solve()函式,它將接收e和i作為引數。
如果e[i]等於"f",則:
返回(False, i + 1)
否則,如果e[i]等於"t":
返回(True, i + 1)
op := e[i],i := i + 2
定義一個棧
當e[i]不是右括號時,執行:
如果e[i]等於",",則:
i := i + 1
忽略以下部分,跳到下一次迭代。
res, i := solve(e, i)
將res壓入棧中。
如果op等於"&",則:
如果棧中所有元素都為true,則返回true,否則返回false,i + 1
否則,如果op等於"|":
如果棧中至少有一個元素為true,則返回true,否則返回false,i + 1
返回(棧[0]的逆值, i + 1)
在主方法中,執行以下操作:
s, y := solve(表示式, 0)
返回s
讓我們看下面的實現來更好地理解:
示例
class Solution(object):
def parseBoolExpr(self, expression):
s,y = self.solve(expression,0)
return s
def solve(self,e,i):
if e[i] =="f":
return False,i+1
elif e[i] == "t":
return True,i+1
op = e[i]
i = i+2
stack = []
while e[i]!=")":
if e[i] == ",":
i+=1
continue
res,i = self.solve(e,i)
stack.append(res)
if op == "&":
return all(stack),i+1
elif op == "|":
return any(stack),i+1
return not stack[0],i+1
ob = Solution()
print(ob.parseBoolExpr("|(!(t),&(t,f,t))"))輸入
"|(!(t),&(t,f,t))"
輸出
False
廣告
資料結構
網路
關係資料庫管理系統(RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP