栈简介
栈(Stack)是只允许在一端进行插入或者删除操作的线性表。它的操作特性可以概括为——后进先出(Last In First Out,LIFO)。栈顶(Top)——线性表允许进行插入删除的一端;
栈底(Bottom)——线性表不允许进行插入删除的一端;
解析表达式
以±乘()为例。
数据栈记录数值,操作符栈记录操作符。
遇到右括号或运算结束时才计算加减,此时确保没有乘法。ret = 0; 如果栈顶操作符是+,则ret += 数据栈顶, 否则ret -=数据栈顶。两个栈出栈。直到遇到(或操作栈为空。如果遇到(,则把左括号出栈。栈顶元素 += ret。
乘法执行时机:新的运算数或括号执行完成。 只需要执行一次乘法。
操作数(变量、常量) 之前的符合如果是乘号,马上计算。否则,等右括号或结束时,统一计算。
操作符栈只会有+ - (*。
难度分 | |
---|---|
【栈】1106. 解析布尔表达式 | 1880 |
【栈】1096. 花括号展开 II | 2348 |
【栈】224. 基本计算器 | |
【回溯 栈 代数系统 动态规划】282. 给表达式添加运算符 | |
【栈】591. 标签验证器 | |
【栈】726. 原子的数量 | |
【栈】770. 基本计算器 IV |
了解逆波兰表达式
前缀(前序)表达法(波兰表达式):+ a b
中缀(中序)表达法:a + b 我们常用的表达方式。
后缀(后续)表达法(逆波兰表达式):a b +
逆波兰表达式优点,运算简单,不需要括号:
操作数入栈,遇到操作符,则取出栈顶两个元素,进行运算,并将结果入栈。
局部变量的作用域
对顶栈
难度分 | |
---|---|
【对顶栈】2296. 设计一个文本编辑器 | 1911 |
临项消除
难度分 | |
---|---|
【栈 最小公倍数 最大公约数】2197. 替换数组中的非互质数 | 2057 |
【栈】2751. 机器人碰撞 | 2091 |
括号合法性判断
较难题为主,以后补充。
单调栈
其它
难度分 | |
---|---|
【栈】895. 最大频率栈 | 2027 |
【栈】1172. 餐盘栈 | 2109 |
扩展阅读
视频课程
有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步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++**实现。