当前课程知识点:数据结构(上) > 第四章 栈与队列 > (c4)栈应用:中缀表达式求值 > 04C4-6D 实例D
这个时候如果你手头有
那张优先级表的话
我建议你去看一下
右括号所对应的那一列
你会发现大多数的表项都是大于号
这意味着什么呢?
这意味着一旦我们扫描
并且处理到一个右括号
介于这个右括号以及
与它配对的左括号之间的
那个子表达式中,所此前缓存起来的
无论多少个运算符,都等到了
可以依次计算的时机
这与我们通常进行
中缀表达式计算的常识
是吻合的
因此接下来
我们此前所缓存的阶乘运算
以及减法运算都会相继执行
也就是说,我们接下来
要执行0的阶乘,得到1
然后接下来,再执行减法
也就是89减去1,得到88
至此,正如我们刚才所指出的
介于这对括号之间的
那个子表达式已经计算完毕
它所对应的值
已经存放在操作数栈的顶端
因此这个右括号,与这个左括号
其实也就是我们当下的
这个栈顶操作符
同样完成了它们的历史使命
现在是它们该退出历史舞台的时候了
而在它们退出历史舞台之后的情景
应该自然是这样,它们消失了
而我们的关注点呢,将转向下一个字符
再一次地,按照我们刚才所总结的规律
一旦出现右括号
它所对应的那个比较项
通常都是大于号
也就是意味着在此前缓存起来的计算
也就是这个减号等到了
可以执行的时机
因此接下来,我们将执行
7减去88,应该是-81
此后,我们的当前右括号运算符
与配对的左括号相逢了
这意味着它们
联手退出历史舞台的时候也到了
此后的场景呢,自然应该是这样
同样,我们会继续去关注下一个字符
仍然是一个右括号运算符
同样地,它的出现意味着
此前我们所缓存起来的这个减法运算
已经可以执行了
是6减去-81,得到正87
紧接下来,这个右括号和这个左括号
应该联手退出
得到这样一个情况,依然是右括号
这就意味着,我们此前所缓存的
这个减法运算也到了可以执行的时机
因此接下来,我们要执行
120减去87,得到33
好了
最后这对括号
退出历史舞台的时候也到了
它们会黯然地离去
至此,我们终于抵达了这个表达式的末尾
也就是我们原来所说的那个\0
我们依然需要去查询\0
与当前的栈顶乘号之间的优先级关系
我们会发现是个大于号
那么这意味着什么呢?
意味着乘号可以执行了
同样地,如果你手头有那张优先级表
我依然鼓励你去察看一下
\0所对应的那一列
你会发现这样一个大于号,并非个案
实际上,凡是遇到当前运算符为\0
它都会促成此前所缓存下来的
任何一个常规运算符的执行
如果你还记得我们刚刚总结的规律
就会发现\0和我们的右括号
是完全效果等同的
更确切地讲
我们这个结尾处的\0
以及最开始铺垫
在运算符栈中的那个\0
联合起来的功效
就相当于在最前端增加一个左括号
同时最末端增加一个右括号
只不过它们都是\0
从功能语义上讲
它们联手等效于一对括号
所以作为右括号
它会促成当前的栈顶运算执行
也就是61乘以33,得到2013
而再接下来的最后一步呢?
末尾处的\0和起始处
此前铺垫的那个\0
也终于经过长途的奔波之后,相逢了
既然它们分别等效于左括号与右括号
它们的历史使命也至此完成
携手退出历史舞台
从而最终运算符栈变空
那我们讲过
当最末尾的字符也扫描处理完之后
如果栈为空
而且你的语法是正确的话
你所需要计算的解
就应该是在运算数栈中
那个唯一的元素
2013
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验