• 学院打卡第十四天


    今天是一道困难题,难得有困难题!!

    如题:

    但是这个困难题感觉也不是很”困难“!!!

    算法思想:

    第一感觉就是利用栈的思想,这种题做多了,一看见就是想到栈!!!果然真行!!!

    ---初始化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中的第一个元素(也只剩一个元素了!)

    代码:(有一些细节在代码注释里提到!)

    1. class Solution:
    2. def parseBoolExpr(self, expression: str) -> bool:
    3. nums, symbols = [], []
    4. for i in expression:
    5. if i == "&" or i == "|" or i == "!":
    6. symbols.append(i)
    7. elif i == ",":
    8. continue
    9. else:
    10. if i == ")":
    11. sym = symbols.pop()#先得出运算符
    12. if sym=="!":
    13. num=not nums.pop()
    14. elif sym=="&":
    15. num=True
    16. while len(nums)!=0 and nums[-1]!="(":
    17. num=nums.pop() and num#nums.pop()要放前面,防止num是false直接跳过nums.pop()进入死循环!
    18. else:
    19. num=False
    20. while len(nums)!=0 and nums[-1]!="(":
    21. num=nums.pop() or num #nums.pop()要放前面,防止num是true直接没有去nums.pop()进入死循环!!!!
    22. nums.pop()#左括号出栈
    23. nums.append(num)#结果入栈
    24. else:
    25. if i=="f":
    26. nums.append(False)
    27. elif i=="t":
    28. nums.append(True)
    29. else:
    30. nums.append(i)
    31. return nums[0]

    运行结果:

    今天的打卡完成啦!!!

  • 相关阅读:
    [C++][数据结构][图][中][图的遍历][最小生成树]详细讲解
    Docker Desktop Windows 无法启动
    基于SSM的大学校医管理系统
    Linux地址映射那些事,堪称初学者的噩梦!
    Qt——智能指针实战
    Roguelike 游戏中的计算哲学
    想转行IC但不想写代码,你可以考虑这个岗位
    阿里云架构师金云龙:基于云XR平台的视觉计算应用部署
    Directory Monitor Pro v2.15.0.7 文件目录监控软件
    Trie树(字典树)C++详解
  • 原文地址:https://blog.csdn.net/m0_58803171/article/details/127702633