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

假设我们有一个字符串s,其中包含带有运算符“ and”和“ or”的布尔表达式,对其求值并返回结果。此处的表达式可能带有括号,应首先对其进行评估。

因此,如果输入类似于s =“ T and(F or T)”,则输出将为True

为了解决这个问题,我们将按照以下步骤操作:

  • 堆栈:=一个新列表

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

  • 对于t中的每个v

    • ct:= v中的右括号“)”的数量

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

    • 对于范围从0到ct-1的每个值,请执行

    • 右:=从堆栈弹出

    • 当v [从“(”的索引到结尾]与“ T”相同时,将true推入堆栈

    • 如果v [0]与“(”相同,则

    • 否则,当找到“)”时,

    • :=从堆栈弹出

      • 将op [v]推入堆栈

      • 当v与“ T”相同时将true推入堆栈

      • 左:=从堆栈弹出

      • 执行操作(从左到右)并推入堆栈

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

      • 除此以外,

      • 如果堆栈中的元素计数> 1,则

        • stack [i + 2]:= stack [i + 1](stack [i],stack [i + 2])

        • 对于范围在0到堆栈大小的i-1,增加2,执行

        • 返回栈顶元素

      • 返回堆栈的底部元素

      让我们看下面的实现以更好地理解:

      示例

      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