leetcode:解析布尔表达式

一、题目

给你一个以字符串形式表述的 布尔表达式(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 _”后的语句.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值