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