用 Python 编写程序来从字符串中计算布尔表达式?

pythonserver side programmingprogramming更新于 2026/2/16 6:36:17

假设我们有一个字符串 s,其中包含带有运算符"and"和"or"的布尔表达式,请计算它并返回结果。这里的表达式可能有括号,应该先求值。

所以,如果输入是 s = "T and (F or T)",那么输出将为 True

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

  • stack := a new list

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

  • 对于 t 中的每个 v,执行

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

      • 当 v[从 "(" 的索引到末尾] 与 "T" 相同时,将 true 推送到堆栈中

    • 否则当 ")" 为找到,则

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

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

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

        • right := 从堆栈中弹出

  • := 从堆栈中弹出

    • left := 从堆栈中弹出

    • 执行操作(左 o 右)并推送到堆栈中

    • 否则当 v 为"T"时或"F",则

      • 当 v 与"T"相同时,将 true 推送到堆栈

    • 否则,

      • 将 op[v] 推送到堆栈

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

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

      • stack[i + 2] := stack[i + 1](stack[i], stack[i + 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

相关文章


有用资源