【数据结构】——队列
一、队列的概念和结构
概念:
只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先 出FIFO(First In First Out)。
入队:进行数据插入的一端叫做队尾
出队:进行删除操作的一端叫做队头
如下图所示:
结构:
队列的实现其底层结构和我们上一节学习的栈一样,其可以使用数组和链表进行实现,不过我们分析一下那种实现方法更优呢,我们的队列其是一端进,另外一端出那么我们的头尾都要进行操作,那么我们如果选择的是数组,如果是让数组的尾部为队尾,那么我们插入数据的时间复杂度为O(1),然后我们就只能选择在数组的头部为队头了,那么我们的数据删除就为头插,那么我们删除数组的头元素的话,那么我们的后面元素就要往前移动,那么此时的时间复杂度就为O(n)。
换端也是一样的,我们要是头插,那么就要先将原来的数组的元素都往后移动一位,然后才可以插入数据,时间复杂度也是为O(n)。
那么我们要是使用链表呢,那么我们链表的头插和头删时间复杂度一直都是O(1),那么我们的尾插和尾删呢,我们前面学习的时候会知道,我们要遍历才可以找到尾部,但是我们现在可以使用一个指针,一直记录着当前队列的尾节点的地址,那么我们就不需要遍历了,那么我们此时的时间复杂度就为O(1)了。所以我们下面实现队列我们的底层使用链表进行实现。
二、队列的实现
1、队列的创建
我们上面提到,我们的队列使用链表来实现会比较好,就是我们要创建一个指针来存储尾节点的地址,这样我们就不需要进行遍历找尾节点了,所以我们可以这么来创建,先创建一个节点的结构体,然后我们再创建一个队列结构体,这个队列结构体的成员就是两个节点指针,一个指针是指向队头,一个是队尾。
如下:
2、队列的初始化
我们创建好一个队列后,最好对其进行初始化,那么我们下面就实现一个对队列的初始化函数,那么,那么我们这个函数传入的参数类型应该为队列结构体类型:Queue*。
然后我们如何进行初始化呢?就是对两个指针变量置空即可。
3、队列的销毁
我们上面完成了对队列的创建,那么我们的队列改如何进行销毁呢?
其实很简单,我们就遍历,然后对这个队列的每个节点进行销毁即可。
4、队列的入队
我们的队列的底层是使用链表创建的,那么我们的队列的入队其实和链表的插入数据差不多,就是还是一样,我们要对当前队列是否为空进行判断,如果为空,我们就要特殊处理一下,如果不是那么我们就正常尾插即可。
5、出队
我们上面的入队是在链表的尾部进行的,那么根据队列的概念,那么我们的出队就要从链表的头部开始,那么就是我们链表的头删,不过我们还是要注意一个特殊情况,就是我们的链表要进行删除,那么我们的队列需要有内容,所以我们先判断这个队列是否有内容,然后就是我们的头删,那么我们的删除是让我们的头节点变成队列当前头节点的下一个节点,那么当我们此时就只有一个元素的时候,就没有下一个节点的情况了,所以对于只有一个节点的情况,那么我们要特殊处理一下。
代码如下:
6、取队头元素
取队头元素,那么我们就是取链表的头节点的元素
代码如下:
7、取队尾元素
取队尾元素,那么就取这个链表的尾节点元素,我们的队列结构在创建的时候,我们的ptali指针就是指向的尾部,所以我们直接访问即可。
那么我们的队列的功能的实现就基本完成了,后面我们会进行三道栈和队列的相应的题目进一步巩固我们栈和队列的学习。
谢谢大家的观看。