在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 [0]与“(”相同,则
-
:=从堆栈中弹出
- 左:=从堆栈中弹出
-
执行操作(左或右)并将其推入堆栈中
-
否则,当v为“T”或“F”时,则
- 当v与“T”相同时将true推入堆栈中
- 否则,
- 将op [v]推入堆栈中
- 如果堆栈中的元素计数> 1,则
- 对于范围在0到堆栈大小-1之间的i,增加2,执行以下操作:
- stack [i + 2]:= stack [i + 1](stack [i],stack [i + 2])
- 返回堆栈的顶部元素
- 对于范围在0到堆栈大小-1之间的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