给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果。
有效的表达式需遵循以下约定:
- “t”,运算结果为 True
- “f”,运算结果为 False
- “!(expr)”,运算过程为对内部表达式 expr 进行逻辑 非的运算(NOT)
- “&(expr1,expr2,…)”,运算过程为对 2 个或以上内部表达式 expr1, expr2, … 进行逻辑 与的运算(AND)
- “|(expr1,expr2,…)”,运算过程为对 2 个或以上内部表达式 expr1, expr2, … 进行逻辑 或的运算(OR)
示例 1:
输入:expression = "!(f)"
输出:true
示例 2:
输入:expression = "|(f,t)"
输出:true
示例 3:
输入:expression = "&(t,f)"
输出:false
示例 4:
输入:expression = "|(&(t,f,t),!(t))"
输出:false
提示:
- 1 <= expression.length <= 20000
- expression[i] 由 {‘(’, ‘)’, ‘&’, ‘|’, ‘!’, ‘t’, ‘f’, ‘,’} 中的字符组成。
- expression 是以上述形式给出的有效表达式,表示一个布尔值。
代码
class Solution:
def parseBoolExpr(self, s: str) -> bool:
def calc(a, b, op):
x, y = a == 't', b == 't'
ans = x | y if op == '|' else x & y
return 't' if ans else 'f'
nums, ops = [], []
for c in s:
if c == ',':
continue
if c == 't' or c == 'f':
nums.append(c)
if c == '|' or c == '&' or c == '!':
ops.append(c)
if c == '(':
nums.append('-')
if c == ')':
op, cur = ops.pop(), ' '
while nums and nums[-1] != '-':
top = nums.pop()
cur = top if cur == ' ' else calc(cur, top, op)
if op == '!':
cur = 't' if cur == 'f' else 'f'
nums.pop()
nums.append(cur)
return nums[-1] == 't'