从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
热门推荐
10 八一幼儿祝福语大全简短
11 公司乔迁食堂祝福语简短
12 婚礼结束聚餐祝福语简短
13 儿媳买车妈妈祝福语简短
14 毕业送礼老师祝福语简短
15 同事辞职正常祝福语简短
16 恭贺新婚文案祝福语简短
17 金店立秋祝福语简短英文
18 婆婆高寿祝福语大全简短