当前课程知识点:数据结构(上) > 第四章 栈与队列 > (c4)栈应用:中缀表达式求值 > 04C4-3 实例
来看这样一个实例
待计算的表达式水平地罗列于此
同时我们还需要引入一个
用于计算的辅助栈
以下我们逐次地扫描
并且处理这个表达式中的各个字符
如果是数字 就进栈
如果是运算符
在尚未判定它已经拥有
足够高的优先权
可以立即计算之前
我们也暂时将它纳入栈中
同样地 运算数也入栈
接下来 我们遇到了乘号
由此可见
刚才我们没有
贸然执行加法运算是对的
同样 对于乘号来说
它也不能判定现在已经足够计算
至少现在是这样
所以我们也依然将它纳入栈中
好 接下来的操作数
我们这里都统一采用简明的策略
直接入栈
情况等到
减号出现的时候 发生了转机
因为相对于这时候
最靠顶端的运算符乘号
新遇到的这个运算符优先级更低
反过来 乘号就到了可以计算的时候
因此取出这个乘号
以及它相应的操作数
完成一次计算
并且将计算的结果重新纳回栈中
接下来 继续比较当前运算符
以及栈顶部的
其实也是现在唯一的那个运算符加号
我们会发现它们彼此相当
但是因为加号出现在前
所以加号终于等到了
可以执行的时机
因此将它取出 使用对应的操作数
得到正确的结果并且纳入栈中
此时减号才可以随后入栈
再接下来遇到1 同样它也入栈
接下来 我们遇到了一种不同的情况
也就是出现了
另一个紧随其后的数字
我们说 这对应于当前这个运算数
是一个多位数
因此我们要做的事情
是将原来的这个数弹出
乘以10之后 再加上新的这个数位
并且重新纳回栈中
从而正确地解析出
原来的这个两位数的数值
再接下来 我们遇到了除号
相对于除法 减法的
优先级还不足够高
所以减法还没有到执行的时候
因此随后除号入栈
接下来的运算数5也入栈
最终我们抵达
整个表达式的末尾标志\0
此时我们可以判断出
除法的运算 实际已经到达
因此我们会执行这样一个除法
并且将数值重新纳回栈中
同样 对于终止服务\0来说
任何的栈顶操作符
实际上都到了可以执行的时机
所以再接下来
这个减号也会进而执行
其实 即使此后栈中
还有其它的运算符
都将依次执行
只要这个表达式是合法的
最终在栈内唯一的那个元素
就是我们所要得到的结果
相对于此前那种纸面操作
这样一个过程
更加接近于机器
能够自动实现的层次
然而我们说
离我们最终的目标还有差距
原因在于我们每次在栈顶
检出这个可以计算的子表达式
无论是2乘3 还是10除以5
都不是那么自然
那么诀窍在哪呢?
在于将运算符和运算数分别对待
也就是说 我们需要2个而不是1个栈
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验