在Python中解析布尔表达式

假设我们有一个布尔表达式,我们必须在对该表达式求值后找到结果。

表达式可以是-

  • “ t”,评估为True;

  • “ f”,评估为False;

  • “!(表达式)”,计算内部表达式的逻辑非;

  • “&(expr1,expr2,...)”,计算2个或更多内部表达式的逻辑与;

  • “ |(expr1,expr2,...)”,求两个或多个内部表达式的逻辑或;

因此,如果输入类似于“ |(!(t),&(t,f,t))”,则输出将变得混乱,这是因为!(t)为假,则&(t,f, t)也为假,因此所有假值的OR均为假。

为了解决这个问题,我们将遵循以下步骤-

  • 定义solve(),这将需要e,i

  • 如果e [i]与“ f”相同,则-

    • 返回(False,i + 1)

  • 否则,当e [i]与“ t”相同时-

  • 返回(True,i + 1)

  • op:= e [i],i:= i + 2

  • 定义一个堆栈

  • 当e [i]不在右括号中时,执行-

    • 我:=我+ 1

    • 忽略以下部分,跳至下一个迭代

    • 如果e [i]与“,”相同,则-

    • res,i:=解决(e,i)

    • 将res推入堆栈

  • 如果op与“&”相同,则-

    • 当所有元素在堆栈中都为true时,返回true;否则为i + 1

  • 否则,当op与“ OR”相同时-

    • 当至少一个元素在堆栈中为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