
但是这个困难题感觉也不是很”困难“!!!
第一感觉就是利用栈的思想,这种题做多了,一看见就是想到栈!!!果然真行!!!
---初始化2个栈,一个symbol装运算符!,&,|。一个nums装括号以及t,f。
---然后遍历字符串
---当遇到逗号 , 直接跳过
---遇到运算符,直接装入symbol
---当遇到 ( 、 t、 和 f 直接装入nums栈中,t和f要分别转换为True和False装入!
----遇到右括号 ) 就要分情况讨论了!!!!
(1)symbol栈出一个元素,如果是 !,那么nums肯定只要出一个字符和左括号进行not 运算
(2)如果是&则定义num初始值为True,如果是|则定义初始值为False,然后对nums进行出栈操作直到栈顶为左括号,每出来一个与num进行对应的运算并且重新赋值给num
(3)最后把左括号出栈,把得出的结果num再入栈
---结束循环的时候,返回nums中的第一个元素(也只剩一个元素了!)
- class Solution:
- def parseBoolExpr(self, expression: str) -> bool:
- nums, symbols = [], []
- for i in expression:
- if i == "&" or i == "|" or i == "!":
- symbols.append(i)
- elif i == ",":
- continue
- else:
- if i == ")":
- sym = symbols.pop()#先得出运算符
- if sym=="!":
- num=not nums.pop()
- elif sym=="&":
- num=True
- while len(nums)!=0 and nums[-1]!="(":
- num=nums.pop() and num#nums.pop()要放前面,防止num是false直接跳过nums.pop()进入死循环!
- else:
- num=False
- while len(nums)!=0 and nums[-1]!="(":
- num=nums.pop() or num #nums.pop()要放前面,防止num是true直接没有去nums.pop()进入死循环!!!!
- nums.pop()#左括号出栈
- nums.append(num)#结果入栈
- else:
- if i=="f":
- nums.append(False)
- elif i=="t":
- nums.append(True)
- else:
- nums.append(i)
- return nums[0]

今天的打卡完成啦!!!
