1106. 解析布尔表达式/C++

本文介绍了一种使用栈解析复杂布尔表达式的算法。通过两个栈分别存储运算符和操作数,算法能有效处理多目运算符如&、|和!,实现对布尔表达式的求值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
与波兰表达式类似,利用2个栈,一个存数字,一个存运算符。
略有不同的是,四则运算都是双目运算符,每次计算都是弹出2个数字与1个运算符,结果再压入数字栈中。
但是此题的运算符(或与)都是多目运算符,遇到)要一直弹出到(,用两个变量记录是否出现t或f,
对于&,只要出现false结果就是false
对于|,只要出现true结果就是true
对于!,出现false结果就是true

class Solution {
public:
    bool parseBoolExpr(string expression) {
        stack<char> ops, exps;
        for(char c:expression){
            if(c=='!' || c=='&' || c=='|'){
                ops.push(c);
            }else if(c=='t' || c=='f' || c=='('){
                exps.push(c);
            }else if(c==')'){
                bool t=false,f=false;
                while(exps.top()!='('){
                    char exp = exps.top();
                    exps.pop();
                    if(exp == 't')
                        t=true;
                    else
                        f=true;
                }
                exps.pop();//弹出'('
                
                char op = ops.top();
                ops.pop();
                if(op == '&'){
                    exps.push(f?'f':'t');//只要出现false结果就是false
                }else if(op == '|'){
                    exps.push(t?'t':'f');//只要出现true结果就是true
                }else if(op == '!'){
                    exps.push(f?'t':'f');//出现false结果就是true
                }
            }
        }
        return exps.top()=='t';
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值