在Python中从字符串评估布尔表达式的程序?

在Python中从字符串评估布尔表达式的程序?

假设我们有一个包含运算符“and”和“or”的布尔表达式的字符串s,我们评估它并返回结果。 这里的表达式可能有括号,应该先计算它们。

所以,如果输入如下s =“T and(F或T)”,则输出将是True

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

  • stack:=一个新列表

  • t = s按空格分隔的元素的列表

  • 对于t中的每个v,执行以下操作:

    • 如果v [0]与“(”相同,则
      • 当v [从“(”到末尾的索引]与“T”相同时,将true推到堆栈中
    • 否则,当找到“)”时,则
      • ct:= v中关闭括号“)”的数量

      • 当v [0到v大小-ct的索引]与“T”相同时,将true推到堆栈中

      • 对于范围在0到ct-1之间的每个值,执行以下操作:

      • 右:=从堆栈中弹出

  • :=从堆栈中弹出

    • 左:=从堆栈中弹出

    • 执行操作(左或右)并将其推入堆栈中

    • 否则,当v为“T”或“F”时,则

      • 当v与“T”相同时将true推入堆栈中
    • 否则,
      • 将op [v]推入堆栈中
  • 如果堆栈中的元素计数> 1,则
    • 对于范围在0到堆栈大小-1之间的i,增加2,执行以下操作:
      • stack [i + 2]:= stack [i + 1](stack [i],stack [i + 2])
    • 返回堆栈的顶部元素

  • 返回堆栈的底部元素

让我们看以下实现,以便更好地理解:

更多Python相关文章,请阅读:Python 教程

例子

class Solution:
   def solve(self, s):
      stack = []
      op = {
         "or": lambda x, y: x or y,
         "and": lambda x, y: x and y,
      }
      for v in s.split():
         if v[0] == "(":
            stack.append(v[v.count("(") :] == "T")
         elif v.count(")") > 0:
            ct = v.count(")")
            stack.append(v[:-ct] == "T")
            for _ in range(ct):
               right = stack.pop()
               o = stack.pop()
               left = stack.pop()
               stack.append(o(left, right))
         elif v in ["T", "F"]:
             stack.append(v == "T")
         else:
            stack.append(op[v])

      if len(stack) > 1:
         for i in range(0, len(stack) - 1, 2):
            stack[i + 2] = stack[i + 1](stack[i], stack[i + 2])
         return stack[-1]

      return stack[0]

ob = Solution()
s = "T and (F or T)"
print(ob.solve(s))

输入

"T and (F or T)"

输出

True

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程