收藏 分享(赏)

《数据结构》--第三章 栈与队列.ppt

上传人:tkhy51908 文档编号:12338421 上传时间:2021-12-11 格式:PPT 页数:36 大小:340.50KB
下载 相关 举报
《数据结构》--第三章 栈与队列.ppt_第1页
第1页 / 共36页
《数据结构》--第三章 栈与队列.ppt_第2页
第2页 / 共36页
《数据结构》--第三章 栈与队列.ppt_第3页
第3页 / 共36页
《数据结构》--第三章 栈与队列.ppt_第4页
第4页 / 共36页
《数据结构》--第三章 栈与队列.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、第3章栈与队列 第3章栈与队列 学习目的要求 栈的基本概念和栈的基本运算 栈在计算机中的应用 队列的基本概念和队列的基本运算 队列在计算机中的应用 3 1栈 3 2队列 第3章栈与队列 3 1栈 3 1 1栈的定义 栈 Stack 又称堆栈 是一种特殊的线性表 它限定线性表中元素的插入和删除操作只能在线性表的一端进行 允许插入和删除的一端为变化的一端 称为栈顶 top 栈顶的第一个元素称为栈顶元素 栈的另一端称为栈底 bottom 向一个栈插入新元素又称为进栈或入栈 它是把该元素放到栈顶元素的上面 使之成为新的栈顶元素 从一个栈删除一个元素又称为出栈或退栈 它是把栈顶元素删除掉 使其下面的相邻

2、元素成为新的栈顶元素 所以又把栈称为后进先出表 LastInFirstOut 简称为LIFO表 3 1栈 1 InitStack 初始化操作 建立一个空栈S 2 GetTop S x 取栈顶元素操作 若栈S不空 则取栈顶元素 用x返回栈顶元素 3 Push S x 进栈操作 在S栈的栈顶压入一个元素x 4 Pop S x 出栈操作 删除已存在且非空的栈S的栈顶元素 用x返回栈顶元素 5 Empty S 判断一个栈是否为空 若S为空栈 返回一个真值 3 1栈 栈常用的基本操作 3 1 2栈的顺序存储结构及其运算 栈的顺序存储结构 简称顺序栈 它是利用一组地址连续的存储单元依次存放自栈底到栈顶的数

3、据元素 例如 用数组element存放栈中的数据元素 数组最大容量为MAXLEN top为栈顶指针 element top 为栈顶元素 3 1栈 进栈时 栈顶指针上移 top加1 出栈时 栈顶指针下移 top减1 top 1 栈为空 从空栈中再删除一个元素 栈将溢出 称为 下溢 top 0 栈中有一个元素 top MAXLEN 1 栈满 向栈中再插入一个元素 栈也将溢出 称为 上溢 3 1栈 3 1 2栈的顺序存储结构及其运算 对于顺序栈 入栈时 必须首先判断栈是否满了 若栈满 不能入栈 出栈时 必须判断栈是否为空 若为空 不能出栈 3 1栈 3 1 3栈的链式存储结构及其运算 栈的链式存储结

4、构简称为链栈 它是一种特殊的单链表 也是一种动态存储结构 不用预先分配存储空间 3 1栈 1 进栈 首先要向系统申请一个结点的存储空间 将新元素的值写入新结点的数据域中 然后修改栈顶指针 3 1栈 p data x p next top top p 2 出栈 先取出栈顶元素的值再修改栈顶指针释放原栈顶结点 3 1栈 p top x top data top top next free p 练习 对于下面的每一步画出栈中元素及栈顶指针示意图 1 空栈 2 元素a b c进栈 3 元素d e f进栈 4 删除元素f和e 5 元素g进栈 3 1 4栈的应用举例 栈是计算机软件中应用最广泛的数据结构之

5、一 1 算术表达式的计算 进行表达式运算时 必须设置两个栈 一个栈用于存放运算符 一个栈用于存放操作数 在表达式运算过程中 编译程序对算术表达式从左向右进行扫描 遇到操作数 就把操作数放入操作数栈 遇到运算符时 把该运算符与运算符栈的栈顶比较 如果该运算符优先级高于栈顶运算符的优先级 就把该运算符进栈 否则退栈 退栈后 在操作数栈中退出两个元素 其中先退出的元素在运算符右边 后退出的元素在运算符左边 然后用运算符栈中退出的栈顶元素进行运算 运算结果存入操作数栈中 反复进行上述操作 直到扫描结束 3 1栈 例3 1用栈求表达式6 8 4 3 5的值 3 1栈 扫描到 运算符优先级低于栈顶运算符

6、退栈 操作数栈中退出两个元素4和8 先退出的放在运算符右边 后退的放在左边 运算符优先级与运算符 相同 退栈 求表达式6 8 4 3 5的值 续 操作数 直接输出 用空格间隔开来 运算符 与栈顶运算符比较 运算级别高的进栈 相同或低的出栈 括号 遇到左括号 进栈 右括号 退栈 退到左括号为止 例3 2将中缀表达式2 3 5 6 4 转换成等价的后缀表达式 3 1栈 2 中缀表达式转换成等价的后缀表达式 后缀表达式 235 64 3 函数递归的实现 函数直接或间接地调用自己的算法 叫做递归算法 3 1栈 例3 3求n 递归函数的执行过程如下 1 系统首先为递归调用建立一个工作栈 在该工作栈中存放

7、参数 局部变量和调用后的返回地址等信息 2 在每次递归调用之前 把本次算法中所使用的参数 局部变量的当前值和调用后的返回地址等压入栈顶 3 在每次执行递归调用结束之后 又把栈顶元素弹出 分别赋给相应的参数和局部变量 以便使它们恢复到调用前的状态 然后返回由返回地址所指定的位置 4 继续执行后续指令 例3 4求4 3 1栈 3 1栈 例3 5Hanoi塔问题 将A上的N 1个挪到B上 将A上第N个挪到C上 将B上的N 1个挪到C上 3 2队列 3 2 1队列的定义 队列 queue 也是一种特殊的线性表 它仅允许在表的一端进行插入 在表的另一端进行删除 允许插入的一端称为队尾 rear 允许删除

8、的一端称为队首 front 队列又称为先进先出表 FirstInFirstOut 简称FIFO 队列的基本操作可以归纳为以下几种 1 InitQueue 初始化一个空队列Q 2 GetFront Q y 取队列Q的队头元素 y返回其值 但队列Q状态不变 3 EnQuene Q x 若队列Q还有空间 将元素x插入到队尾 4 DelQueue Q y 若队列Q不为空 删除队列Q的队头元素 y返回其值 5 Empty Q 判断队列Q是否为空 若为空返回一个真值 否则返回一个假值 3 2队列 3 2 2队列的顺序存储结构及其运算 1 顺序队列 sequentialqueue 顺序队列与顺序表一样 用一

9、个一维数组来存放数据元素 在内存中 用一组连续的存储单元顺序存放队列中各元素 例如 用数组element存放队列元素 数组最大容量为MAXLEN 队首指针为front 队尾指针为rear 队首指针front指向队列中第一个元素的前一个位置 队尾指针rear指向队列中最后一个元素的位置 3 2队列 空队列front rear队满rear MAXLEN 1添加一个元素rear rear 1删除一个元素front front 1 3 2队列 1 入队 3 2队列 首先要判断是否队满 若发生队满 应返回队满信息0 若队不满 则插入元素 q rear q element q rear x q rear

10、MAXLEN 1 2 出队 3 2队列 首先要判断是否队空 若队空 应返回队空值0 若队非空 则删除元素 q front x q element q front q front q rear 顺序队列存在 假溢出 问题 尾指针rear指向最后一个元素 但前面有元素已经出队 这时要插入元素 仍然发生溢出 而实际上队列并未满 2 循环队列 循环队列将首尾相连 即将element 0 与element MAXLEN 1 连接起来 形成一个环形表 3 2队列 在循环队列中 当rear front时 不能判定循环队列是空队还是满队 因此规定 front rear是循环队列空的标志 rear 1 MAXL

11、EN front是循环队列满的标志 所以 在循环队列满时 队列中实际上还有一个空闲单元 以防止空队与满队的标志发生冲突 1 入队 3 2队列 首先要判断是否队满 若队满 应返回队满信息0 若队不满 则插入新元素 cq rear 1 MAXLEN cq front cq rear cq rear 1 MAXLEN cq element cq rear x 2 出队 3 2队列 首先要判断是否队空 若队为空 应返回队空信息0 若队不为空 则将队首元素存入x中 cq rear cq front cq front cq front 1 MAXLEN x cq element cq front 3 2

12、3队列的链式存储结构及其运算 3 2队列 队列的链式存储结构称为链队列 linkedqueue 队列头指针front指向队列表头结点 队列尾指针指向队列的尾结点 队列空的条件是front rear 1 入队 3 2队列 首先要向系统申请一个结点的存储空间 将新元素的值写入新结点的数据域中 然后修改链队列尾指针 p data x p next NULL rear next p rear p 2 出队 3 2队列 从带表头结点的链队列中删除队首元素 p front next front next p next x p data free p 如果原链队列只有一个元素 if p next NULL

13、rear front 3 2 4队列的应用 例3 6打印数据缓冲区问题 在内存中设置一个打印数据缓冲区 缓冲区是一块连续的存储空间 把它设计成循环队列结构 1 主机把要打印的数据依次写入到这个缓冲区中 写满后就暂停输出 主机此时可以进行其他工作 2 打印机就从缓冲区按照先进先出的原则依次取出数据并打印 3 打印完这批数据后 再向主机发出请求 4 主机接到请求后 再向缓冲区写入打印数据 3 2队列 例3 7键盘输入循环缓冲区问题 与打印机类似 键盘也有一个键盘缓冲区 也把它设计为循环队列结构 1 键盘输入的字符先存储到一个缓冲区中 2 当系统当前任务结束后 就从键盘缓冲区依次取出已输入的字符 并按要求进行处理 优点 循环结构可以限制缓冲区的大小 有效利用存储空间 可以大大提高主机的工作效率 3 2队列 栈是一种运算受到限制的特殊线性表 它仅允许在线性表同一端进行插入和删除操作 栈是一种后进先出的线性表 简称为LIFO表 栈在日常生活和计算机程序设计中有着广泛的应用 如算术表达式求值 函数的嵌套和递归调用等 队列也是一种运算受到限制的特殊线性表 它仅允许在线性表一端进行插入 在另一端进行删除 队列是一种先进先出的特殊线性表 简称为FIFO表 队列的链式存储结构与单链表类似 但删除结点只能在表头 插入元素只能在表尾 本章小结

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报