从Python中的字符串评估布尔表达式的程序?
假设我们有一个字符串s,其中包含带有运算符“and”和“or”的布尔表达式,对其求值并返回结果。此处的表达式可能带有括号,应首先对其进行评估。
因此,如果输入类似于s=“Tand(ForT)”,则输出将为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