• Leetcode1106:解析布尔表达式


    原文链接:1106. 解析布尔表达式 - 力扣(LeetCode)


    题目

            给你一个以字符串形式表述的 布尔表达式(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 是以上述形式给出的有效表达式,表示一个布尔值。

    解题思路

    1、利用栈,存放不为,和)的元素
    2、遇到 )则将最靠上的( 到 )之间的元素全部弹出
          同时记录t和f的个数
    3、然后根据此时栈顶元素的符号数,判断这一段的结果是什么
    4、最后栈中只剩一个元素,即结果

    时间:16ms 空间:41.4MB

    1. class Solution {
    2. public boolean parseBoolExpr(String expression) {
    3. Stack stack=new Stack<>();
    4. for(char temp : expression.toCharArray()){
    5. if(temp != ',' && temp!=')'){
    6. stack.push(temp);
    7. }
    8. else if(temp==')'){
    9. //如果当前元素为右括号
    10. int t=0,f=0;
    11. //不断弹出栈顶元素,直到栈顶为左括号
    12. while(stack.peek()!='('){
    13. char con = stack.pop();
    14. //记录t和f的数量
    15. if(con == 't')t++;
    16. else f++;
    17. }
    18. stack.pop();//弹出'('
    19. //弹出并返回符号数
    20. char operator = stack.pop();
    21. if(operator=='&'){
    22. //符号数是&,则判断是否存在f
    23. //如果存在,结果为f,然后入栈
    24. char ans = f>0?'f':'t';
    25. stack.push(ans);
    26. }
    27. else if(operator=='|'){
    28. //符号数是|,则判断是否存在t
    29. //存在,结果为t,入栈
    30. char ans = t>0?'t':'f';
    31. stack.push(ans);
    32. }
    33. else{
    34. //符号数是!,判断是否为t
    35. //是,则取反,入栈
    36. char ans = t>0?'f':'t';
    37. stack.push(ans);
    38. }
    39. }
    40. }
    41. //此时栈顶只剩一个元素,判断是否为t即可
    42. return stack.peek()=='t';
    43. }
    44. }

  • 相关阅读:
    1978. 上级经理已离职的公司员工
    ElementUI之登陆+注册
    【JVM】对象创建与访问
    MySQL十秒插入百万条数据
    Playwright UI 自动化测试实战
    java System
    this指向
    ThreadLocal常见使用场景
    说一下 ArrayList 和 LinkedList 的区别?
    UGeek大咖说美图专场精彩回顾:围绕故障治理浅谈可观测性建设
  • 原文地址:https://blog.csdn.net/qq_52726736/article/details/127735412