当前课程知识点:数据结构(上) > 第四章 栈与队列 > (c4)栈应用:中缀表达式求值 > 04C4−6C 实例C
这是一个操作数
所以我们直接将它归入操作数栈中
也就是说 接下来的状态应该是这样
5入栈 我们随即将注意力转向下一个字符
这是一个阶乘运算符
算法的处理手法依然
这里我们采用刚刚记下来的诀窍
当左括号在栈顶的时候
它总是乐于接收包括阶乘在内的
任何一个常规运算符
所以接下来,我们会看到
阶乘号不出意外地入栈
同时注意力转向下一个字符
我们看到这是一个减法运算符
同样地,将减法与阶乘进行优先级比较
会发现出现了一次大于号的情况
也就是说,我们刚才所缓冲起来的
阶乘运算现在等到了能够执行的时机
讲到这里,细心的你或许会发现
在我们目前所定义的运算符体系中
阶乘号是优先级最高的
所以即便是它被推入了栈中
在接下来的一步中,必将会出栈并且执行
既然如此,我们为什么不判断出来
阶乘号而直接运算呢
原因在于虽然可以利用这种性质
加速阶乘处理
但是无形中必然会引入一句额外的判断
而且这句判断是对所有的运算符
都要执行一次的
而我们刚才所做的优化的效果
只能体现在阶乘这一种运算上
得与失两相比较,得不偿失
所以不妨采用算法
所建议的这种简明的方法
统一进行处理
好了
回到我们的阶乘运算符
既然它可以运算
我们就应该
弹出栈顶元素5来进行运算
并且将所得的结果,我们心算一下
120重新纳回操作数栈中
作为新的栈顶
同时,我们的关注力依然停留在
仍未处理完毕的减法运算上
既然接下来,栈顶运算符是左括号
按照我们刚才所总结的规律
它总是乐于接收
包括减号在内的任何运算符
所以接下来,减法运算符会顺利地进栈
转为这样的一个状态
而此后呢,我们的关注力
转向接下来的字符,也就是左括号
我们刚刚总结过
左括号出现在当前的位置
它也会被任何栈顶操作符乐于接纳
所以它也会随即进栈
转入这样一个状态
我们的关注力,会转向下一个字符6
作为一个操作数
它也会顺利地推入操作数栈中
成为这样
好
接下来又碰到了
我们总结到的一个情况
左括号处于栈顶的时候
它也会乐于接受
包括当前的减号在内的
任何一个运算符
所以接下来减法运算符
也会顺利地进栈
我们又转向了下一个左括号
同样它会入栈
并且转向下一个操作数7
这个操作数会随即进栈
并转向下一个操作符减法
同样
这个时候栈顶既然是左括号
减法运算符也会顺利地入栈
这个时候我们又再次地遇到了左括号
左括号人缘非常好
它也会被任何一个字符接纳
成为它顶端的朋友
我们的关注力,这个时候转向了8
当然8会随即进栈
但是接下来,我们的注意力又转向了9
此时就涉及到我们在算法中
所提供的一个叫ReadNumber的例程
它的具体实现
虽然我们只是放在示例代码包中
但是我们从语义上能够知道
它是用来读取像89这样的多位数的
其实它的原理也非常简单
对于这样连续的一系列的数字
它会每一次都将上一次的结果弹出栈
乘以10,加上当前的这个字符
然后再重新地推入栈中
就这个例子而言
我们接下来应该把8弹出乘以10
再加上9,得到89
操作数栈的栈顶被替代为89
同时,我们的关注焦点转向下一个字符减法
再一次地,这个减法运算符
会被当前处于栈顶的
那个好客的左括号
接纳,成为它顶端的朋友
所以应该转入这样一个状态
而我们的关注焦点转向下一个数字0
同样,作为操作数,它会直接被推入栈中
变成操作数栈的栈顶
同时我们的关注力转向阶乘
经过查表,不出我们的意料
作为优先级最高的运算符
阶乘号自然会比减法更加优先
所以接下来
我们应该将这个阶乘运算符推入栈中
并且将注意力转向下一个字符
也就是右括号
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验