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

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

作者: 艺术类架构师 | 来源:发表于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;
                
        }
    };
    
    

    相关文章

      网友评论

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

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