在 Python 中解析布尔表达式

pythonserver side programmingprogramming更新于 2026/1/22 8:12:17

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

表达式可以是 −

  • "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

相关文章


有用资源