本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、什么是队列
①基础概念: 队列是只允许在一端进行插入操作,另一端进行删除操作的一种数据结构。进行删除的一端称为队头,插入的一端称为队尾。
②结构特点: 队列中的元素具有先进先出的的特点。通俗的说就像生活中的排队点餐——先排队的先点到餐。 ③彩图讲解:
二、队列的C语言实现
①实现方式的选择 就像我们上一节所讲讲解的栈一样,队列既可以通过顺序表来实现,也可以通过链表来实现。但结合我们之前所讲解的知识,用链表来实现队列更优,因为对于链表来说头插和尾插非常的轻松,且可以按需申请空间。所以接下来我们通过链表来实现我们的队列。 ②队列的链表形式定义
【关键点讲解】
- 重命名数据类型便于进行全局队列内数据类型的修改
- 我们的队列是基于单链表实现的
- 队列里分别有头指针和尾指针,分别便于我们出队和入队操作
三、QueueInit()初始化接口
①接口作用:初始化队列 ②源码剖析:
> 【关键点讲解】> 1. 初始时头尾指针置为NULL。入队时再开辟空间
四、QueuePush()入队接口
①接口作用:从队尾压入一个元素 ②动图演示:
③源码剖析
【关键点讲解】
- 别忘记将next指针置为NULL
- 注意要判断队列是否为空
- 注意插入元素后尾指针需要更新
五、QueuePop()出队接口
①接口作用:弹出队首的元素 ②动图演示:
③源码剖析
【关键点讲解】
- 注意判断pop掉当前元素如果队列为空,head和tail都要置为NULL
- 注意别想错free(q)了,free的是动态开辟出来的内存
六、QueueFront()接口
①接口作用:返回队首元素值 ②源码剖析:
七、QueueBack()接口
①接口作用:返回队尾的元素值 ②源码剖析:
八、QueueSize()接口
①接口作用:返回队尾中的元素个数 ②源码剖析:
【关键点讲解】
- 当然也可以在定义的时候额外增加上“sz”这个成员,这样就不需要额外的函数
九、QueueEmpty()接口
①接口作用:判断队列是否为空 ②源码剖析:
十、QueueDestroy()接口
①接口作用:销毁队列 ②动图演示:
③源码剖析
【关键点剖析】
- 记录下一结点,将当前结点free
- 注意不要把q给free了