当前课程知识点:数据结构(上) > 第四章 栈与队列 > (c4)栈应用:中缀表达式求值 > 04C4−6B 实例B
4刚刚入栈 我们的关注点就可以随即
转向接下来的右括号运算符
同样,当前运算符和栈顶运算符
经过一次比较以后
我们会发现是属于大于号的情况
这意味着我们刚才所
缓存起来的减法运算
等到了能够执行的时机
因此接下来会执行65减去4
并且将所得的结果61
重新纳入这个栈中
可以看到,的确如此
请注意,我们的关注力依然集中在
刚才的右括号上
接下来,将当前的这个右括号
与栈顶的左括号进行优先级比较
通过查阅优先级表
我们确认这是一个相等的关系
这依然是一种简明的情况
我们应该还记得
它所执行的动作有两步
首先将栈顶的操作符弹出
接下来跳过当前字符
进而转向下一个字符
从效果上看,这等价于这对括号完全不存在
没错,如果我们回顾一下刚才的历史
就会发现这对括号的作用
只是阶段性的
它们只是为了界定
介于它们之间这个
子表达式的运算优先级
而我们刚才通过一系列的准确的处理
已经将这个子表达式计算完毕
它对应的结果已经存放在操作数栈中了
从这个意义上讲
这对括号的历史使命也都完成了
所以它们可以携手退出历史舞台
这是再自然不过的结局了
我们来看一下这个结局
确实这对括号消失了
而我们的注意力转向了一个新的历史开端
也就是接下来的乘法运算符
我们同样通过查表确认
乘法运算符和当前的
栈顶\0之间的关系
依然是小于号
此时如果你手头确实有那么一张
优先级表的话
那么我建议你关注一下\0所对应的那一行
你会发现其实不光是对于乘号
只要是常规的加减乘除之类的运算
这样一行中
所给出来的优先级判断关系
都是统一的小于号
而且如果你再关注一下左括号对应的
那一行的话
你也会发现有类似的规律
其实这个规律不难理解
正像我们此前所说的
无论是\0,还是左括号
它们都可以比喻为是
一个非常谦恭而且好客的君子
只要它遇到的是一个常规的预算符
都会谦让地让它随即入栈
排列在它的,从栈的方向来讲的,上方
而为了达到这个效果
一种简明的方法
自然就是将对应的优先级项
置为小于号
所以这也就是为什么
\0以及左括号所对应的那一行
几乎都是小于号的原因
所以此后凡是\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)深度优先搜索--作业
-第六章 图--本章测验