美文网首页
力扣细节题求逻辑表达式的返回值

力扣细节题求逻辑表达式的返回值

作者: 头发掉了 | 来源:发表于2023-02-23 05:15 被阅读0次

/**
布尔表达式 是计算结果不是 true 就是 false 的表达式。有效的表达式需遵循以下约定:

't',运算结果为 true
'f',运算结果为 false
'!(subExpr)',运算过程为对内部表达式 subExpr 进行 逻辑非(NOT)运算
'&(subExpr1, subExpr2, ..., subExprn)',运算过程为对 2 个或以上内部表达式 subExpr1, subExpr2, ..., subExprn 进行 逻辑与(AND)运算
'|(subExpr1, subExpr2, ..., subExprn)',运算过程为对 2 个或以上内部表达式 subExpr1, subExpr2, ..., subExprn 进行 逻辑或(OR)运算
给你一个以字符串形式表述的 布尔表达式 expression,返回该式的运算结果。

题目测试用例所给出的表达式均为有效的布尔表达式,遵循上述约定。

来源:力扣(LeetCode)

示例 1:

输入:expression = "&(|(f))"
输出:false
解释:
首先,计算 |(f) --> f ,表达式变为 "&(f)" 。
接着,计算 &(f) --> f ,表达式变为 "f" 。
最后,返回 false 。
示例 2:

输入:expression = "|(f,f,f,t)"
输出:true
解释:计算 (false OR false OR false OR true) ,结果为 true 。
示例 3:

输入:expression = "!(&(f,t))"
输出:true
解释:
首先,计算 &(f,t) --> (false AND true) --> false --> f ,表达式变为 "!(f)" 。
接着,计算 !(f) --> NOT false --> true ,返回 true 。

提示:

1 <= expression.length <= 2 * 104
expression[i] 为 '('、')'、'&'、'|'、'!'、't'、'f' 和 ',' 之一

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/parsing-a-boolean-expression
**/

  #define BOOL(c)  ( c=='t'?1:0)
  #define FLAG(_logic)  ( _logic=='&'?AND:_logic=='|'?OR:NOT)
  #define XORANDNOT(_a,_b,_flag)  (_flag==AND?_a&&_b:(_flag==OR?_a|_b:!_b))

class Solution {
public:
    bool parseBoolExpr(string expression) {

     stack<int> stk;
    //辅助栈
     stack<int> helper;
    
     const int AND=2/*&*/,OR=3/*OR*/,NOT=4/*!*/;

       for(auto _logic:expression){
                if(_logic=='|'||_logic=='&'||_logic=='!'){
                    stk.push(FLAG(_logic));
                    helper.push(FLAG(_logic));
                    continue;
                }
                if(_logic=='('||_logic==','){
                    continue;

                }
                if(_logic=='f'||_logic=='t'){
                    stk.push(BOOL(_logic));
                    continue;
                }
             
                   int _flag=helper.top();
                   bool  _a=_flag==AND?true:false;
                   helper.pop();
                   while(!stk.empty()){
                        int _b=stk.top();
                        stk.pop();
                       if(_b==_flag)stk.push(_a),break;
                     _a=XORANDNOT(_a,_b,_flag);
                   }
       }
     return stk.top()&1;
            
    }
};

相关文章

  • 7.JavaScript-逻辑运算符

    1.什么是逻辑运算符? 名称?格式?返回值?特点?1.1逻辑与 格式:条件表达式A && 条件表达式B返回值:tr...

  • 399. 除法求值(Python)

    题目 难度:★★★★☆类型:图方法:深度优先搜索 力扣链接请移步本题传送门更多力扣中等题的解决方案请移步力扣中等题...

  • 个人技术点图片介绍

    算法:力扣第一题:https://www.jianshu.com/p/d578de7d1dc9力扣第二题:http...

  • 8个字记住++i和i++

    ++i和i++的相同点:表达式执行后i最终都会加1 表达式返回值不同:表达式返回值不同:表达式返回值不同:表达式返...

  • 413. 等差数列划分(Python)

    题目 难度:★★☆☆☆类型:数组方法:动态规划 力扣链接请移步本题传送门更多力扣中等题的解决方案请移步力扣中等题目...

  • 416. 分割等和子集(Python)

    题目 难度:★★★☆☆类型:数组方法:动态规划 力扣链接请移步本题传送门更多力扣中等题的解决方案请移步力扣中等题目...

  • 397. 整数替换(Python)

    题目 难度:★★☆☆☆类型:数组方法:数学 力扣链接请移步本题传送门更多力扣中等题的解决方案请移步力扣中等题目录 ...

  • 398. 随机数索引(Python)

    题目 难度:★★☆☆☆类型:数组方法:数学 力扣链接请移步本题传送门更多力扣中等题的解决方案请移步力扣中等题目录 ...

  • 396. 旋转函数(Python)

    题目 难度:★★★☆☆类型:数组方法:动态规划 力扣链接请移步本题传送门更多力扣中等题的解决方案请移步力扣中等题目...

  • 394. 字符串解码(Python)

    题目 难度:★★★☆☆类型:字符串方法:栈 力扣链接请移步本题传送门更多力扣中等题的解决方案请移步力扣中等题目录 ...

网友评论

      本文标题:力扣细节题求逻辑表达式的返回值

      本文链接:https://www.haomeiwen.com/subject/bxezkdtx.html