一、操作受限的线性表
1> 在之前的内容,无论是顺序表还是链表,都是详细处理的线性表,既可以在端点处进行操作,也可以在中间位置操作
2> 现实生活中,有很多并不需要在中间进行操作的序列,只在端点处进行操作,这样的线性表,我们称为操作受限的线性表
3> 根据不同的受限情况,线性表分为:栈、队列
4> 栈:插入和删除操作都只允许在同一端进行。
队列:插入和删除操作都只允许在异端进行。
二、栈
2.1 栈的相关概念
1> 栈:操作受限的线性表,插入和删除只能在同一端进行,不能在中间进行相关操作
2> 允许操作的一端,称为栈顶,不允许操作的一端称为栈底
3> 特点:先进后出(后进先出)
例如:水杯容器、枪的弹夹
4> 栈的分类:根据存储方式的不同,分为顺序栈和链式栈
顺序栈:顺序存储的栈称为顺序栈
链式栈:链式存储的栈称为链式栈
-
2.2 顺序栈
-
1>原理图
-
2> 结构体类型
-
3> 创建栈 创建栈空间后,还需要为栈申请存储空间
-
4> 判空、判满
-
5> 入栈 先加后压
-
6> 出栈 先弹后减
-
7> 遍历栈 本质上是数组的遍历
-
8> 获取栈顶元素的地址
-
9> 求栈的大小 本质上就跟top有关
-
10> 销毁栈 先销毁容器,再销毁栈
-
-
2.3 链式栈
-
1> 链式存储的栈,称为链式栈
-
2> 对于单链表而言,我们可以使用,使用头插头删完成一个栈,或者尾插尾删完成链式栈
-
3> 头插头删:链表的头部就是栈顶,链表的尾部就是栈底(常用)
-
4> 尾插尾删:链表的尾部就是栈顶,链表的头部就是栈底
-
三、队列
-
3.1 队列介绍
-
1> 队列也是操作受限的线性表:所有操作只能在端点处进行,其删除和插入必须在不同端进行
-
2> 允许插入操作的一端称为队尾,允许删除操作的一端称为队头
-
3> 特点:先进先出(FIFO)
-
4> 分类: 顺序存储的队列称为顺序队列 链式存储的队列,称为链式队列
-
-
3.2 顺序队列
-
1> 使用一片连续存储的空间存储队列,并且给定两个变量,分别记录队头和队尾下标
-
2> 普通顺序队列使用中,存在“假溢满”现象 假溢满:队列中明明还有存储空间,但是由于队尾已经达到了数组的最大下标,不能在继续入队元素了
-
3> 为了解决“假溢满”现象,我们引入了循环顺序队
-
-
3.3 循环顺序队列
-
1> 循环顺序队列:通过相关操作,当对头或队尾达到数组最大下标时,可以返回到下标为0的位置
-
2> 结构体类型:一个数组存储队列,两个变量分别存储队头和队尾的下标 注意:需要人为浪费一个存储空间,用于判满
-
3> 创建队列
-
4> 判空判满
-
5> 入队:将数据放入队尾所在位置
-
6> 遍历队
-
7> 出队
-
8> 求队列的大小:只用队头和队尾完成
-
9> 销毁队列
-
-
3.4 链式队列
-
1> 链式存储的队列称为链式队列
-
2> 实现原理: 单向链表头插尾删实现:链表的头部就是队尾,链表的尾部就是队头 单向链表头删尾插实现:链表的头部就是队头,链表的尾部就是队尾 但是:上述操作中,都要用到链表尾部节点,都需要遍历整个链表完成,效率较低 此时,我们可以引入尾指针的概念,专门指向最后一个节点的指针。
-
3> 将一个头指针和一个尾指针封装成一个队列
-
4> 队列类型
-
5> 创建队列 注意:先创建出队列、然后创建链表、将队列的两个指针指向链表
-
6> 队列判空 只需要队头和队尾都指向头结点即可
-
7> 入队
-
8> 遍历队
-
9> 出队 出队时,需要注意,如果所有节点全部出队,则需要将尾指针重新指向头结点 10> 销毁队伍
-
11> 求队列长度
-