【栈】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++**实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/24703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv 在飞行堡垒8中调用camera导致设备消失

简介 使用 OpenCV 库时, 在最后调用cv::destroyAllWindows()之后设备管理器中的摄像头设备消失了&#xff0c; 看看是怎么触发的&#xff0c; 后面再慢慢研究RootCause是什么。 步骤 设备管理器原来摄像头显示 1. 代码 main.cpp Note: 1. haarcascade_frontalface_default…

cocos入门9:三维向量点乘

在cocos creator中&#xff0c;三维向量的点乘&#xff08;Dot Product&#xff09;是一个基础但重要的概念&#xff0c;特别是在3D图形学、物理模拟和光照计算等领域。点乘的结果是一个标量&#xff08;scalar&#xff09;&#xff0c;它描述了两个向量之间的角度关系以及其中…

AI智能客服经验总结

AI智能客服经验总结 在使用OpenAI的API接口来构建人工智能客服系统时&#xff0c;prompt约束是非常重要的。它可以帮助确保生成的回复符合你的期望和需求。以下是一些关于如何设置和管理prompt约束的建议&#xff1a; 1. 明确客服系统的目标 首先&#xff0c;明确你的客服系…

python中的解包操作(*和**)

在Python中&#xff0c;* 和 ** 用于函数定义和函数调用时的参数解包和传递&#xff0c;它们有不同的用途和作用。以下是它们的详细解释和区别&#xff1a; 单星号 (*) 1. 位置参数解包&#xff08;函数调用&#xff09; 在函数调用时&#xff0c;* 用于将列表或元组解包成位…

R语言 | 使用最简单方法添加显著性ggpubr包

本期教程原文&#xff1a;使用最简单方法添加显著性ggsignif包 本期教程 获得本期教程代码和数据&#xff0c;在后台回复关键词&#xff1a;20240605 小杜的生信笔记&#xff0c;自2021年11月开始做的知识分享&#xff0c;主要内容是R语言绘图教程、转录组上游分析、转录组下游…

容声冰箱正式发布主动除菌净味白皮书,守护家人饮食健康

近日&#xff0c;由中国家用电器研究院指导、全国家用电器工业信息中心和容声冰箱联合编制的《冰箱主动除菌净味技术发展白皮书》&#xff08;下称《白皮书》&#xff09;正式发布。 《白皮书》指出&#xff0c;容声将IDP主动除菌技术应用到冰箱冷冻、冷藏区域&#xff0c;实现…

使用本地锁syncronized防止缓存击穿

谷粒商城学习笔记p156 缓存击穿&#xff1a;单个key缓存突然失效&#xff0c;这时大量的请求进行访问&#xff0c;导致数据库压力过大。缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期)&#xff0c;这时由于并发用户特别多&#xff0c;同时读缓存没读到数据&am…

对待谷歌百度等搜索引擎的正确方式

对待百度、谷歌等搜索引擎的方式是&#xff0c;你要站在搜索引擎之上&#xff0c;保持自己的独立思想和意见。 当谷歌宣布他们将会根据一个名为“Alphabet”的新控股公司来进行业务调整时&#xff0c;在科技界引起了一片恐慌之声。 永远不要说这是一个公司一直在做的事情。不…

一文快速搞懂Nginx —— Nginx 详解

一文快速搞懂Nginx 一、nginx 简介二、正向 / 反向代理2.1 正向代理2.2 反向代理三、负载均衡四、动静分离五、web 缓存六、Nginx 安装6.1 windows版本下的安装6.2 Linux版本下的安装七、常用命令八、为什么选择Nginx 一、nginx 简介 Nginx 同 Apache 一样都是一种 Web 服务器。…

使用 Python 的 Tkinter 来创建 GUI 应用程序

Tkinter 是 Python 自带的一个图形用户界面&#xff08;GUI&#xff09;工具包&#xff0c;它提供了丰富的 GUI 组件和工具&#xff0c;可以用于快速开发各种应用程序 安装和导入 Tkinter 首先&#xff0c;需要确保你已经安装了 Python&#xff0c;并且版本号在 3.0 及以上&a…

嵌入式Linux系统编程 — 3.1 Linux系统中的文件类型

目录 1 Linux 系统中的文件类型简介 2 普通文件 2.1 什么是普通文件 2.2 普通文件分类 3 目录文件 4 字符设备文件和块设备文件 4.1 什么是设备文件 4.2 查看设备文件的方法&#xff1a; 5 符号链接文件&#xff08;link&#xff09; 5.1 什么是符号链接文件 5.2 如…

大模型多轮问答的两种方式

前言 大模型的多轮问答难点就是在于如何精确识别用户最新的提问的真实意图&#xff0c;而在常见的使用大模型进行多轮对话方式中&#xff0c;我接触到的只有两种方式&#xff1a; 一种是简单地直接使用 user 和 assistant 两个角色将一问一答的会话内容喂给大模型&#xff0c…

光伏电站绘制软件的基本方法

随着可再生能源的快速发展&#xff0c;光伏电站的建设日益受到重视。为了提高光伏电站设计的效率和准确性&#xff0c;光伏电站绘制软件的应用变得至关重要。本文将介绍光伏电站绘制软件的基本方法&#xff0c;包括绘制屋顶、屋脊、障碍物和参照物&#xff0c;铺设光伏板&#…

FreeRTOS 阻塞式I2C操作异常 I2C_WaitOnFlagUntilTimeout规避

I2C_WaitOnFlagUntilTimeout 是一个在STM32的HAL库中用于等待I2C操作完成的函数。FreeRTOS是一个可以运行在嵌入式系统上的实时操作系统。在FreeRTOS中&#xff0c;如果你想要实现I2C操作的阻塞式等待&#xff0c;可以使用I2C_WaitOnFlagUntilTimeout函数。 但是&#xff0c;F…

typedef和define的区别

在C语言中&#xff0c;typedef和define都是用来创建别名以增强代码的可读性和可维护性&#xff0c;它们在**执行时间、作用域和功能**等方面存在差异。具体如下&#xff1a; 1. **执行时间** - **typedef**&#xff1a;处理于编译阶段&#xff0c;因此具备类型检查的功能Θic-1…

PCL Loess曲线回归拟合(二维)

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 LOESS(局部加权回归)回归的原理是基于非参数方法,它主要用于描述两个变量之间复杂的、非线性的关系。LOESS方法的核心在于“局部”和“加权”。它会在每个数据点附近选取一个子集(或称为窗口),并利用这个子集…

使用Python编写Ping监测程序

Ping是一种常用的网络诊断工具&#xff0c;它可以测试两台计算机之间的连通性&#xff1b; 如果您需要监测某个IP地址的连通情况&#xff0c;可以使用Python编写一个Ping监测程序&#xff1b; 本文将介绍如何使用Python编写Ping监测程序 首先&#xff0c;需要导入os、sys、t…

spark复习

第一章 1.​大数据特点:4V 2.​大数据计算模式 3.​hadoop生态系统 4.​spark提供了内存计算和基于DAG的任务调度机制&#xff0c;遵循一个软件栈满足不同应用场景的理念。 5.​hadoop中MapReduce计算框架的缺点&#xff0c;对应的spark的优点 第二章 1.​spark生态系统 …

HTML做成一个炫酷跳动爱心的页面

大家好&#xff0c;今天制作制作一个炫酷跳动爱心的页面&#xff01; 先看具体效果&#xff1a; 要创建一个炫酷跳动爱心的HTML页面&#xff0c;你可以使用HTML、CSS和JavaScript的组合。以下是一个简单的示例&#xff0c;它使用CSS动画和JavaScript来实现跳动效果。 首先&…

vue项目中oss网络图片无法显示的问题

问题说明 如果后台给你烦返回了oss地址的图片,也许会出现如下情况 在图片路径无误的情况下,图片无法正常预览和回显 但是在浏览器中打开却没问题 解决方案 就需要在项目的index.html中做出如下配置,便能正常回显 <meta name"referrer" content"no-referr…