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

解题思路

  1. 这道题主要的解题思路就是:栈+模拟+计数+位运算.
  2. 遇到’,‘不影响,直接跳过,遇到’(,t,f’直接压栈,遇到’)'就弹栈,通过统计t,和f的个数,完事儿后弹出左括号和左运算符,然后根据左括号的运算符以及统计的t和f的个数,进行接下来true和false的计算,并压入栈中。

实现代码

class Solution {
    public boolean parseBoolExpr(String expression) {
        Deque<Character> stack = new ArrayDeque<Character>();
        int n = expression.length();
        for (int i = 0; i < n; i++) {
            char c = expression.charAt(i);
            //如果是,直接跳过
            if (c == ',') {
                continue;
            //如果不是)压栈
            } else if (c != ')') {
                stack.push(c);
            } else {
                int t = 0, f = 0;
                //统计t和f的数量
                while (stack.peek() != '(') {
                    char val = stack.pop();
                    if (val == 't') {
                        t++;
                    } else {
                        f++;
                    }
                }
                //抛出'('
                stack.pop();
                //然后得到运算符
                char op = stack.pop();
                switch (op) {
                    case '!':
                        stack.push(f == 1 ? 't' : 'f');
                        break;
                    case '&':
                        stack.push(f == 0 ? 't' : 'f');
                        break;
                    case '|':
                        stack.push(t > 0 ? 't' : 'f');
                        break;
                    default:
                        break;
                }
            }
        }
        return stack.pop()=='t';
    }
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值