【栈】1106. 解析布尔表达式
本文涉及知识点
栈
LeetCode 1106. 解析布尔表达式
布尔表达式 是计算结果不是 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,返回该式的运算结果。
题目测试用例所给出的表达式均为有效的布尔表达式,遵循上述约定。
示例 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’ 和 ‘,’ 之一
递归
这个容易想到。
栈
不需要数据栈,只需要操作符栈。本题运算符和操作数都是单字符,很好解析。
除逗号和右括号外,全部入栈。
忽略逗号。
遇到右括号,出栈直到左括号出栈。
记录出栈的 t f数量。记录并出栈运算符。
运算结果入栈。
代码
class Solution {
public:bool parseBoolExpr(string exp) {for (const auto& ch : exp) {if (',' == ch) { continue; }if (')' == ch) {int cnts[2] = { 0 };while ('(' != m_sta.top()) {cnts['t' == m_sta.top()]++;m_sta.pop();}m_sta.pop();bool bRet = true;if ('&' == m_sta.top()) {bRet = (0 == cnts[0]);}else if ('|' == m_sta.top()) {bRet = (0 != cnts[1]);}else {bRet = cnts[0];}m_sta.pop();m_sta.push(bRet ? 't' : 'f');continue;}m_sta.emplace(ch);}return 't' == m_sta.top();}stack<char> m_sta;
};
单元测试
template<class T1,class T2>
void AssertEx(const T1& t1, const T2& t2)
{Assert::AreEqual(t1 , t2);
}template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{Assert::AreEqual(v1.size(), v2.size()); for (int i = 0; i < v1.size(); i++){Assert::AreEqual(v1[i], v2[i]);}
}template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{sort(vv1.begin(), vv1.end());sort(vv2.begin(), vv2.end());Assert::AreEqual(vv1.size(), vv2.size());for (int i = 0; i < vv1.size(); i++){AssertEx(vv1[i], vv2[i]);}
}namespace UnitTest
{string expression;TEST_CLASS(UnitTest){public:TEST_METHOD(TestMethod0){expression = "&(|(f))";auto res = Solution().parseBoolExpr(expression);AssertEx(false,res);}TEST_METHOD(TestMethod1){expression = "|(f,f,f,t)";auto res = Solution().parseBoolExpr(expression);AssertEx(true, res);}TEST_METHOD(TestMethod2){expression = "!(&(f,t))";auto res = Solution().parseBoolExpr(expression);AssertEx(true, res);}};
}

扩展阅读
视频课程
有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176
相关下载
想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653
| 我想对大家说的话 |
|---|
| 《喜缺全书算法册》以原理、正确性证明、总结为主。 |
| 闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。 |
| 子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。 |
| 如果程序是一条龙,那算法就是他的是睛 |
测试环境
操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

相关文章:
【栈】1106. 解析布尔表达式
本文涉及知识点 栈 LeetCode 1106. 解析布尔表达式 布尔表达式 是计算结果不是 true 就是 false 的表达式。有效的表达式需遵循以下约定: ‘t’,运算结果为 true ‘f’,运算结果为 false ‘!(subExpr)’,运算过程为对内部表达式…...
u盘内容无故消失了是什么原因?u盘部分内容无故消失了怎么恢复
在数字化时代,U盘作为便携存储设备,承载着许多重要的数据。然而,有时我们可能会遭遇U盘部分内容无故消失的情况,这无疑给我们的工作和生活带来了不小的困扰。本文将为您解析U盘内容消失的可能原因,并分享几招实用的数据…...
glm-4v-9b 部署
glm-4v-9b 模型文件地址 GLM-4 仓库文件地址 官方测试 硬件配置和系统要求 官方测试硬件信息: OS: Ubuntu 22.04Memory: 512G…...
Ansible——unarchive模块
目录 参数总结 基础语法 常见的命令行示例 示例1:解压缩文件到指定目录 示例2:解压缩文件并设置权限 示例3:远程URL解压缩 示例4:强制覆盖现有文件 具体步骤和示例 示例5:只要文件解压后,如果存在…...
Ansible——get_url模块
目录 主要用途 参数总结 基本语法示例 使用示例 示例1:下载文件 示例2:使用校验和验证文件 示例3:使用 HTTP 基本认证 示例4:通过代理服务器下载文件 示例5:设置文件权限、所有者和组 示例6:强制…...
macbook本地部署 pyhive环境连接 hive用例
前言 公司的测试和生产环境中尚未提供基于Hive的客户端。若希望尝试操作Hive表,目前一个可行的方案是使用Python语言,通过借助pyhive库,您可以对Hive表进行各种操作。以下是一些示例记录供您参考。 一、pyhive是什么? PyHive是一…...
物理安全防护如何创新强化信息安全体系?
物理安全防护是信息安全体系的重要组成部分,它通过保护实体设施、设备和介质等,防止未授权访问、破坏、盗窃等行为,从而为信息系统提供基础的安全保障。要创新强化信息安全体系中的物理安全防护,可以从以下几个方面着手࿱…...
【JAVASE】日期与时间类(上)
一:概述 从JAVA SE 8开始提供了java.time包,该包中有专门处理日期和时间的类。 LocalDate LocalDateTime 和LocalTime 类的对象封装和日期、时间有关的数据,这三个类都是final类,而且不提供修改数据的方法,即这…...
如果需要精确的答案,请避免使用float和double
float和double主要为了科学计算和工程计算而设计,执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不适合用于需要精确结果的场合,尤其是…...
大模型,也在卷价格
“百模大战”已从算力战、规模战蔓延到了价格战。 5月15日,字节跳动宣布豆包主力模型(小于等于32K)在企业市场的定价只有0.0008元/千Tokens,0.8厘就能处理1500多个汉字,比行业便宜99.3%;5月21日࿰…...
开关电源中电感设计
开关电源设计中电感 只有充分理解电感在DC/DC电路中发挥的作用,才能更优的设计DC/DC电路。本文还包括对同步DC/DC及异步DC/DC概念的解释。 在开关电源的设计中电感的设计为工程师带来的许多的挑战。工程师不仅要选择电感值,还要考虑电感可承受的电流,绕线电阻,机械尺寸等…...
机器视觉——硬件常用基础知识
光源 机器视觉中光源的作用 1)强化特征,弱化背景 2)光源打得好,图好了,后期算法更简化 3)图好了,测试速度更高 各种光源的综合性能对比及为啥使用LED灯 光的颜色的选择 白色光:通常用…...
宝塔 php7.4 安装SQLserver扩展
一、加入微软源 curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssqlrelease.repo二、安装odbc驱动程序 yum install msodbcsql mssql-tools unixODBC-devel 三、安装php7.4对应的pdo_sqlsrv扩展包 # 下载 wget http://pecl.php.net/…...
C++中的常见I/O方式
目录 摘要 1. 标准输入输出(Standard I/O) 2. 文件输入输出(File I/O) 3. 字符串流(String Stream) 4. 低级文件I/O(Low-level File I/O) 5. 内存映射文件(Memory-Mapped File I/O) 6. 网络I/O(Network I/O) 服务器端 客户端 摘要 C++中的输入输出操作(…...
Java Web学习笔记23——Vue项目简介
Vue项目简介: Vue项目-创建: 命令行:vue create vue-project01 图形化界面:vue ui 在命令行中切换到项目文件夹中,然后执行vue ui命令。 只需要路由功能。这个路由功能,开始不是很理解。 创建项目部保存…...
[UE 虚幻引擎] DTLoadFbx 运行时加载FBX本地模型插件说明
本插件可以在打包后运行时动态加载FBX模型。 新建一个Actor 并添加一个 DT Runtime Fbx Component。 然后直接调用组件的函数 LoadFile 加载显示模型(注:不支持模型动画) FilePath : 加载模型的绝对路径。 Create Collision : 是否创建碰撞…...
mysql log_bin
MySQL 开启配置binlog以及通过binlog恢复数据 https://blog.csdn.net/weixin_44606481/article/details/133344235 CentoS7 安装篇十二:mysql主从搭建(xtrackbackup不停机搭建) https://blog.csdn.net/chengxuyuanjava123/article/details/1…...
数据整理操作及众所周知【数据分析】
各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…...
maven的install不报错但deploy到nexus报400错误
一.情况描述 mvn install工程正常构建完成,但我mvn deploy报400错误,局域网maven组件仓库nexus也是正常的,deploy的帐号密码都是对的。报错信息如下: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plu…...
WebSocket前端分页:技术深度、实践困境与未来展望
WebSocket前端分页:技术深度、实践困境与未来展望 在前端开发的广阔领域中,WebSocket前端分页技术以其独特的优势逐渐崭露头角。它不仅为开发者带来了全新的交互体验,也为用户带来了更加流畅和高效的信息获取方式。然而,这一技术…...
Linux服务器GPU环境配置避坑指南:从Nvidia驱动到PyTorch Lightning一站式搞定
Linux服务器GPU环境配置避坑指南:从Nvidia驱动到PyTorch Lightning一站式搞定 当你第一次在Linux服务器上配置GPU环境时,可能会遇到各种令人抓狂的问题:驱动安装失败、CUDA版本不兼容、PyTorch无法识别GPU...这些问题足以让任何一个开发者崩溃…...
3个步骤掌握FCEUX:开源NES模拟器的全方位应用指南
3个步骤掌握FCEUX:开源NES模拟器的全方位应用指南 【免费下载链接】fceux FCEUX, a NES Emulator 项目地址: https://gitcode.com/gh_mirrors/fc/fceux FCEUX是一款功能强大的开源NES模拟器(任天堂娱乐系统游戏模拟工具),以…...
QQ音乐加密音频终极解密指南:qmcdump完整教程与实战应用
QQ音乐加密音频终极解密指南:qmcdump完整教程与实战应用 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是…...
终极指南:nanoGPT如何让每个人都能训练自己的AI语言模型?
终极指南:nanoGPT如何让每个人都能训练自己的AI语言模型? 【免费下载链接】nanoGPT The simplest, fastest repository for training/finetuning medium-sized GPTs. 项目地址: https://gitcode.com/GitHub_Trending/na/nanoGPT 想要训练自己的AI…...
Eye-in-Hand还是Eye-to-Hand?深入解读OpenCV手眼标定背后的四种经典算法(Tsai, Park, Horaud)
Eye-in-Hand还是Eye-to-Hand?深入解读OpenCV手眼标定背后的四种经典算法 在工业机器人视觉引导系统中,相机与机械臂的精确标定直接决定了整个系统的定位精度。当工程师第一次调用OpenCV的calibrateHandEye()函数时,面对CALIB_HAND_EYE_TSAI、…...
嵌入式AI边缘计算原型:STM32与云端PyTorch模型协同工作流设计
嵌入式AI边缘计算原型:STM32与云端PyTorch模型协同工作流设计 1. 场景需求与痛点分析 在智能家居、工业监测等物联网场景中,我们常常遇到这样的矛盾:边缘设备需要实时响应,但计算能力有限;云端算力强大,但…...
别只点‘Passive’!深入理解Altium Designer引脚电气类型,从根源上杜绝原理图ERC错误
深入解析Altium Designer引脚电气类型:从原理到实践的设计规范 在电子设计自动化(EDA)领域,原理图设计是整个产品开发流程的基石。许多工程师在使用Altium Designer(AD)时,往往将注意力集中在布…...
Qwen2.5-Coder-1.5B代码修复实战:常见Bug自动诊断与修复
Qwen2.5-Coder-1.5B代码修复实战:常见Bug自动诊断与修复 你有没有过这样的经历?深夜赶项目,代码跑起来一堆红字,对着报错信息一头雾水,查了半天文档还是找不到问题在哪。或者,接手一个老项目,里…...
Qwen3字幕系统Linux部署指南:从安装到性能调优
Qwen3字幕系统Linux部署指南:从安装到性能调优 为视频内容自动生成精准字幕的时代已经到来 还记得手动为视频添加字幕的痛苦经历吗?一遍遍听写、校对、调整时间轴,几分钟的视频往往需要花费数小时。现在,基于Qwen3的智能字幕系统可…...
cutlass代码架构分析
CUTLASS 代码架构分析 本文档基于 cutlass代码进行梳理,快速理解 CUTLASS 4.x 的模块边界与调用链路。 1. 总体架构 CUTLASS 本质上是一个 header-only 的 CUDA C++ 模板库,外围配套了可选构建目标: include/:核心库(cutlass + cute) tools/:库实例化、性能测试与通用…...
