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