数据结构 栈与队列
栈
基本概念
p66 概念
栈是仅限制在表尾进行插入和删除操作的特殊线性表,
限制操作的表尾端称为“栈顶”, 另一 端称为“栈底”
特点:
栈是“后进先出”的线性表(LIFO)或 “先进后出”的线性表(FILO)
栈的抽象数据类型
常见操作
顺序栈
存储结构
与顺序表一样,顺序栈也是使用数组来实现。
基本操作
入栈
入栈的基本要求以及步骤
要求:
插入元素x使其成为顺序栈中新的栈顶元素
步骤:
关键代码
算法3.1
出栈
要求
将栈顶元素从栈中移去,并返回被移去的栈顶元素值
关键代码
算法
链栈
存储结构
重要结论
求链栈的长度
操作 length ()的实现
计算出链栈中所包含的数据元素的个数并返回其值
算法
链栈的入栈操作
push (x )的实现
将数据域值为x的新结点插入到链栈的栈顶,使其成为新的栈顶元素。
步骤:
算法实现
链栈的出栈操作
将首结点(或栈顶结点)从链栈中移去,并返回该结点的数据域的值。
算法: 出栈操作
队列
基本概念
队列是只允许在表的一端进行插入,而在表 的另一端进行删除操作的一种特殊线性表。 允许插入的一端称为“队尾”,允许删除的一 端称为“队首”。
栈是“先进先出”的线性表(FIFO)或 “后进后出”的线性表(LILO)
队列的抽象数据类型
基本操作
接口
顺序队列
使用数组表示
队首
队尾
重要结论
假溢出
问题,及如何解决 p87 含义
解决办法:
最好的办法是把顺序队列所使用的的存储空间看成是一个逻辑上首尾相连的循环队列。
取模操作可以实现: rear = (rear+1)%maxSize
循环顺序队列实现
基本结构
将顺序队列看成是首尾相联的队列。
无法区分队满和队空
循环顺序队列遇到的问题: 队空和队满无法区分
队空与队满的条件相同,无法判断,怎么办?
解决办法:
- 设一个标志变量flag
- 设置一个计数变量num
- 少用一个元素空间
方法1:设一个标志变量flag并置初值为0, 每当入队操作成功后就置flag=1;每当出队操作成功后就置flag=0 。
方法2:设置一个计数变量num并置初值为0,每当入队操作成功后num加1;每当出队操作成功后num减1。
方法3: 少用一个元素空间
代码实现
循环队列实现, 使用的是 少一个元素空间的办法
入队
将新元素x插入到一个循环队列的队尾。
步骤
关键代码
完整算法:
出队
将队首元素删除,并返回其值
步骤:
完整算法:
链队列及其基本操作的实现
存储结构
队列的链式存储结构称为链队列,其链式存储结构在此用不带头结点的单链表来实现.
重要结论
代码
入队
插入新元素x使其成为新的队尾元素。
步骤:
代码
完整算法
出队
移去队首元素并返回其值
步骤:
完整算法
优先队列
基本概念
优先级队列是一种带有优先级的队列,并且按优先级从大到小有序排列。
也有顺序和链式两种存储结构。
优先队列链式存储的结点结构
类的描述
数据结点类
elem表示数据值
priority 表示优先级
入队
入队操作
核心思路:
如果队列是空的 直接添加到队尾,否则 根据要插入结点的优先级,在队列内找到合适的位置进行添加
代码细节:
栈与队列的比较
相同点
1.都是线性结构,即数据元素之间具有“一对一”的逻辑关系。
2.插入操作都是限制在表尾进行。
3.都可在顺序存储结构和链式存储结 构上实现。
4.在时间代价上,插入与删除操作都 需常数时间;在空间代价上,情况也相同。
5.多链栈和多链队列的管理模式可以相同。
不同点
- 删除数据元素操作的位置不同 。
- 两者的应用场合不相同 。
- 顺序栈可实现多栈空间共享,而顺序 队列则不同 。