LeetCode 1106. 解析布尔表达式 做题心路历程,代码与收获

本文介绍了一种使用栈来解析和评估复杂布尔表达式的方法。通过分析表达式中的逻辑运算符(如NOT、AND、OR),文章提供了一个高效的算法实现,能够正确地计算出任意有效布尔表达式的最终结果。

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

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

class Solution {
public:
    bool parseBoolExpr(string expression) {
        int n = expression.size();
        stack<char> stk;
        int i = 1;//测试需要
        for(char item : expression)
        {
            if(item != ',' && item != ')')
            {
                stk.push(item);
            }
            else if(item == ')')
            {
                int tsum = 0, fsum = 0;
                while(stk.top() != '(')
                {
                    if(stk.top() == 't')
                    {
                        tsum++;
                    }
                    else
                    {
                        fsum++;
                    }
                    stk.pop();
                }
                stk.pop();//pop '('
                if(stk.top() == '!')
                {
                    stk.pop();
                    if(tsum == 0)
                    {
                        stk.push('t');
                    }
                    else
                    {
                        stk.push('f');
                    }
                }
                else if(stk.top() == '&')
                {
                    stk.pop();
                    if(fsum == 0)
                    {
                        stk.push('t');
                    }
                    else
                    {
                        stk.push('f');
                    }
                }
                else if(stk.top() == '|')
                {
                    stk.pop();
                    if(tsum != 0)
                    {
                        stk.push('t');
                    }
                    else
                    {
                        stk.push('f');
                    }
                }
                // cout << "tsum:" << tsum << " fsum:" << fsum << " ------" << i << endl;
            }
            // //检验部分
            // stack<char> temp = stk;
            // while(!temp.empty())
            // {
            //     cout << temp.top();
            //     temp.pop();
            // }
            // cout << " ----" << i << endl;
            // i++;
        }
        return stk.top() == 't';
    }
};

1.可能是许久未做题的缘故,有一些分号忘加。
2.测试代码十分精妙,因为stl中stack不能直接遍历,所以找到一个临时栈来进行逆向遍历,当然也可以正向遍历,再反转一遍就行,比较麻烦
3.注意,因为每个测试用例其实必有括号,所以把所有的反括号消除掉以后就是最终解,一个反括号消去一个正括号,并且最终结果没有逗号,所以就是最终解
4.使用tsum与fsum两个变量十分巧妙,因为和true与false顺序无关,只要统计数量就行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值