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

更新于:2020年6月4日

990 次查看

启动您的职业生涯

通过完成课程获得认证

开始学习
广告