一、题目
给你一个以字符串形式表述的 布尔表达式(boolean) expression
,返回该式的运算结果。
有效的表达式需遵循以下约定:
"t"
,运算结果为True
"f"
,运算结果为False
"!(expr)"
,运算过程为对内部表达式expr
进行逻辑 非的运算(NOT)"&(expr1,expr2,...)"
,运算过程为对 2 个或以上内部表达式expr1, expr2, ...
进行逻辑 与的运算(AND)"|(expr1,expr2,...)"
,运算过程为对 2 个或以上内部表达式expr1, expr2, ...
进行逻辑 或的运算(OR)
来源:力扣
二、思路
从左到右遍历expression,对于遍历的每个字符i:
如果i属于‘!&|tf’则入栈,加到列表stk中
如果i是右括号,将stk元素依次出栈并计算tf个数,直到遇到操作符!&|,最后根据字符个数和操作符得到新的字符t或f,最后stk中只剩一个字符,与tf比较返回比价结果。
三、代码
class Solution:
def parseBoolExpr(self, expression: str) -> bool:
result=''#&!f
stk=[]
for i in expression:
if i in 'tf!&|':
stk.append(i)
elif i==')':
t=f=0
while stk[-1] in 'tf':
t +=stk[-1]=='t'
f +=stk[-1]=='f'
stk.pop()
match stk.pop():
case'!':
i='t' if f else 'f'
case'&':
i='f' if f else 't'
case'|':
i='t' if t else 'f'
stk.append(i)
return stk[0]=='t'
list.pop()函数用于移出列表中的最后一个元素,并且返回该值。
match之后跟的是变量或者表达式,而case后面是该变量或者表达式的可能取值,当其值是值1时,则执行语句1,当其值是值2时,则执行语句2,以此类推。如果该变量或者表达式的取值没有在case语句所指定的值中,则执行“case _”后的语句.