在 Python 中解析布尔表达式
假设我们有一个布尔表达式,我们必须在评估该表达式后找到结果。
表达式可以是 −
"t",评估结果为 True;
"f",评估结果为 False;
"!(expression)",评估结果为内部表达式的逻辑 NOT;
"&(expr1,expr2,...)",评估结果为 2 个或更多内部表达式的逻辑 AND;
"|(expr1,expr2,...)",评估结果为 2 个或更多内部表达式的逻辑 OR表达式;
因此,如果输入为"|(!(t),&(t,f,t))",则输出将为假,这是因为 !(t) 为假,则 &(t,f,t) 也为假,因此所有假值的 OR 将为假。
为了解决这个问题,我们将遵循以下步骤 −
定义solve(),这将采用e,i
如果e[i]与"f"相同,则 −
返回(False,i + 1)
否则,当e[i]与"t"相同时−
return (True,i + 1)
op := e[i], i := i + 2
定义一个堆栈
当 e[i] 不是右括号时,执行 −
如果 e[i] 与 "," 相同,则执行 −
i := i + 1
忽略以下部分,跳至下一次迭代
res,i := resolve(e, i)
将 res 推入stack
如果 op 与 "&" 相同,则 −
当 stack 中的所有元素都为真时返回 true,否则返回 false,i + 1
否则当 op 与 " 相同时 OR " −
当堆栈中至少有一个元素为真时返回 true,否则返回 false,i + 1
返回 (stack[0] 的逆,i + 1)
从主方法中,执行以下操作 −
s,y := resolve(expression, 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
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

