学习导航
一、前言
🐱💻文章难度: ★☆☆☆☆
🐱👤适合对象:C语言玩家 + 栈和队列初学者
🐱🐉知识储备:栈和队列的实现基于顺序表和链表
🐱🚀专栏宣传:算法入门系列长期更新,欢迎点赞收藏,祝大家学有所获。
🐱👓代码仓库:罅隙/数据结构【完整代码请参见Gitee仓库】
二、什么是队列
①基础概念:
队列是只允许在一端进行插入操作,另一端进行删除操作的一种数据结构。进行删除的一端称为队头,插入的一端称为队尾。
②结构特点:
队列中的元素具有先进先出的的特点。通俗的说就像生活中的排队点餐——先排队的先点到餐。
③彩图讲解:
三、队列的C语言实现
①实现方式的选择
就像我们上一节所讲讲解的栈一样,队列既可以通过顺序表来实现,也可以通过链表来实现。但结合我们之前所讲解的知识,用链表来实现队列更优,因为对于链表来说头插和尾插非常的轻松,且可以按需申请空间。所以接下来我们通过链表来实现我们的队列。
②队列的链表形式定义
【关键点讲解】
- 重命名数据类型便于进行全局队列内数据类型的修改
- 我们的队列是基于单链表实现的
- 队列里分别有头指针和尾指针,分别便于我们出队和入队操作
四、QueueInit()初始化接口
①接口作用:初始化队列
②源码剖析:> 【关键点讲解】> 1. 初始时头尾指针置为NULL。入队时再开辟空间
五、QueuePush()入队接口
①接口作用:从队尾压入一个元素
②动图演示:
③源码剖析
【关键点讲解】
- 别忘记将next指针置为NULL
- 注意要判断队列是否为空
- 注意插入元素后尾指针需要更新
五、QueuePop()出队接口
①接口作用:弹出队首的元素
②动图演示:
③源码剖析
【关键点讲解】
- 注意判断pop掉当前元素如果队列为空,head和tail都要置为NULL
- 注意别想错free(q)了,free的是动态开辟出来的内存
六、QueueFront()接口
①接口作用:返回队首元素值
②源码剖析:
七、QueueBack()接口
①接口作用:返回队尾的元素值
②源码剖析:
八、QueueSize()接口
①接口作用:返回队尾中的元素个数
②源码剖析:
【关键点讲解】
- 当然也可以在定义的时候额外增加上“sz”这个成员,这样就不需要额外的函数
九、QueueEmpty()接口
①接口作用:判断队列是否为空
②源码剖析:
十、QueueDestroy()接口
①接口作用:销毁队列
②动图演示:
③源码剖析
【关键点剖析】
- 记录下一结点,将当前结点free
- 注意不要把q给free了
十一、后记
- 创作不易,点个赞鼓励一下吧
- 有问题欢迎交流讨论。博主QQ:2879377052
- 完整的代码请参见代码前言里的代码仓库