数据结构篇_编程思想板块_第二章栈和队列的应用
作者:互联网
编程思想板块最主要的内容是数据结构经典题目及解答题目所需的编程思想,愿对您能有所帮助
二、栈的应用
- 当栈空做退栈运算必定产生空间溢出,称“下溢”,上溢是一种错误应该避免,下溢常用作程序控制转移的条件
1)括号匹配
1. 算法思想:
① 初始设置一个空栈,顺序读入括号
② 若是左括号,入栈
③ 若是右括号,与栈顶的左括号相比较,若不匹配直接return
2)表达式求值
-
三式中操作数之间的相对次序相同(二叉树的三种访问次序中,叶子的相对访问次序一致),但运算符的相对次序不同
-
中缀表达式:我们正常模样的表达式
-
后缀表达式(逆波兰表达式):此处一般考从中缀转后缀不能/能转成什么样
① 运算符在操作数后面
② 一个中缀会转成多个后缀,故按”左优先计算“原则确定唯一后缀表达式
③ 表达式模样为<左操作数,右操作数,运算符>
④ 从栈中先弹出的是右操作数
- 前缀表达式(波兰表达式):
① 运算符在操作数前面
② 一个中缀会转成多个前缀,故按”右优先计算“原则确定唯一后缀表达式
③ 表达式模样为<运算符,左操作数,右操作数>
④ 从栈中先弹出的是左操作数
- 中缀表达式计算算法思想:
① 初始化两个栈,操作数栈和运算符栈
② 若扫描到操作数,压入操作数栈
③ 若扫描到运算符或界限符(括号),则按”中缀转后缀“相同的逻辑压入运算符栈(期间也会弹出运算符,每当弹出一个运算符时,需要再弹出两个操作数栈的栈顶元素并执行相应运算,运算结果再压回操作数栈)
- 用栈实现中缀表达式转后缀表达式:
① 初始化一个栈,用于保存暂时还不能确定运算顺序的运算符。
② 从左到右处理各个元素,直到末尾。可能遇到三种情况:
(1) 遇到操作数。直接加入后缀表达式。
(2) 遇到界限符。遇到“(”直接入栈;遇到“)”则依次弹出栈内运算符并加入后缀表达式,直到弹出“(”为止。注意:“(”不加入后缀表达式。
(3) 遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到“(”或栈空则停止。之后再把当前运算符入栈。
③ 按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式。
- 用栈实现后缀表达式的计算:
① 从左往右扫描下一个元素,直到处理完所有元素
② 若扫描到操作数则压入栈,并回到①;否则执行③
③ 若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到①
3)递归中应用
- 递归模型必须满足两个条件:
① 递归表达式(递归体)
② 边界条件(递归出口)
(学会怎么写计算过程)
4)迷宫求解
5)进制转换
6)栈经典题目的编程思想
1. 设有两个栈s1、s2都采用顺序栈方式,并共享一个存储区[0,...,maxsize-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向、迎面增长的存储方式。试设计s1.s2有关入栈和出栈的操作算法。
算法思想:
注意:
① 插入和删除时都要判断栈是否已满或已空
7)队经典题目的编程思想
1. 请设计一个队列,要求满足:
①初始时队列为空;
②入队时,允许增加队列占用空间;
③出队后,出队元素所占用的空间可重复使用,即整个队列所占用的空间只增不减;④入队操作和出队操作的时间复杂度始终保持为O(1)。请回答下列问题:
1) 该队列是应选择链式存储结构,还是应选择顺序存储结构
2) 画出队列的初始状态,并给出判断队空和队满的条件
3) 画出第一个元素入队后的队列状态
4) 给出入队操作和出队操作的基本过程
算法思想:
8)栈和队列应用经典题目的编程思想
1.括号匹配题中并没有大括号可以包括中/小括号这一思想
2. 按下图所示铁道进行车厢调度(注意,两侧铁道均为单向行驶道,火车调度站有一个用
于调度的“栈道”),火车调度站的入口处有n节硬座和软座车厢(分别用H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作(即入栈或出栈操作)序列,以使所有的软座车厢都被调整到硬座车厢之前
算法思想:
两侧的铁道均为单向行驶道,且两侧不相通。所有车辆都必须通过“栈道”进行调度。算法的基本设计思想:所有车厢依次前进并逐一检查,若为硬座车厢则入栈,等待最后调度。检查完后,所有的硬座车厢已全部入栈道,车道中的车厢均为软座车厢,此时将栈道的车厢调度出来,调整到软座车厢之后。
3.
算法思想:
先将n=0和n=1的情况入栈,把n=0和n=2取除算出n3后再把n3和n2入栈,再重复上述操作用n3,n2算出n4,依次计算最后算出的值即为最终值
4. 某汽车轮渡口,过江渡船每次能载10辆车过江。过江车辆分为客车类和货车类,上渡船有如下规定:同类车先到先上船;客车先于货车上船,且每上4辆客车,才允许放上1辆货车;若等待客车不足4辆,则以货车代替;若无货车等待,允许客车都上船。试设计一个算法模拟渡口管理
算法思想:
假设数组q的最大下标为10(类似于哈希表的思想),恰好是每次载渡的最大量.假设客车的队列为q1,货车的队列为q2.若q1充足,则每取4个q1元素后再取一个q2元素,直到q的长度为10.若q1不充足,则直接用q2补齐
三、队列应用
-
树的层次遍历
-
图的广度遍历
-
CPU资源竞争
-
打印机与主机速度不匹配
-
页面替换算法
标签:操作数,队列,编程,车厢,运算符,后缀,算法,数据结构,表达式 来源: https://www.cnblogs.com/oten/p/16293400.html