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