• leetcode1106.解析布尔表达式(11月5日每日一题)


    题目描述:

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

    解答思路:

    看到题解用的都是两个栈,但是感觉一个栈就能够解决题目要求。

    第一部需要分清楚进栈和出栈的条件。

    ① 当遍历的字符串expression[ i ]不是‘   ) ’时,进栈。

    ②当遍历的字符串expressssion[ i ]是‘  ) ’ 时,出栈。

    如果进行②的操作,则取while(),如果定义的栈顶元素到‘(  ’,while()也可以停止了。

    就该考虑t,f的运算逻辑符关系了

    ①当运算逻辑符为 !:如果 t 的数量大于0,则这段运算式为f;否则为 t 。

    ②当运算逻辑符为 |  :如果 t 的数量大于0,则这段运算式为 t;否则为 f 。

    ③当运算逻辑符为 & :如果 f 的数量大于0,则这段运算式为 f;否则为 t。

    然后再将此段逻辑式的结果存放在栈中,接着遍历到下一个 ‘ )’,最后直接取出栈顶元素,如果是t,返回 true;反之 返回 false。

    完整代码:

    1. class Solution {
    2. public:
    3. bool parseBoolExpr(string expression) {
    4. stack<char>s;
    5. for(int i=0;ilength();i++)
    6. {
    7. if(expression[i]==')')
    8. {
    9. int nums_t=0;
    10. int nums_f=0;
    11. while(s.top()!='!'&&s.top()!='&'&&s.top()!='|')
    12. {
    13. if(s.top()=='t')
    14. {
    15. nums_t++;
    16. }
    17. if(s.top()=='f')
    18. {
    19. nums_f++;
    20. }
    21. s.pop();
    22. }
    23. char str=s.top();
    24. s.pop();
    25. if(str=='!')
    26. {
    27. if(nums_f==0)
    28. {
    29. s.push('f');
    30. }
    31. if(nums_t==0)
    32. {
    33. s.push('t');
    34. }
    35. }
    36. if(str=='|')
    37. {
    38. if(nums_t>0)
    39. {
    40. s.push('t');
    41. }
    42. else s.push('f');
    43. }
    44. if(str=='&')
    45. {
    46. if(nums_f>0)
    47. {
    48. s.push('f');
    49. }
    50. else s.push('t');
    51. }
    52. }
    53. else
    54. s.push(expression[i]);
    55. }
    56. if(s.top()=='t') return true;
    57. else return false;
    58. }
    59. };

  • 相关阅读:
    他海投260万未回本,一天手写200面单到效率提升200%,经历了什么
    8、查询优化-关联查询优化-子查询优化-Order by 关键字优化-Group by 关键字优化-双路排序和单路排序
    操作系统第五章——输入输出管理(上)
    C++学习之运算符与表达式
    Python的PyQt框架的使用-构建环境篇
    功能测试求职难,现在不懂自动化测试连外包都进不去了?
    你一般什么时候使用GPT
    PIMPL技巧
    机器学习之特征选择
    2022年浙江省中职组“网络空间安全”赛项模块B--Windows渗透测试
  • 原文地址:https://blog.csdn.net/m0_63743577/article/details/127720057