⼿把⼿教你c语⾔队列实现代码,通俗易懂超详细!
⼤家好,我是⽆际。
近期我们⽆际单⽚机编程分享的⾼级程序架构教程受到了很多粉丝们的⾼度好评和认可。
这个教程只要⽤⼼看的都能体会到⾥⾯巨⼤的价值,特别是⼯作经验在2-3年的。
我们整个教程⾥⾯有⼀章节是⼿把⼿教⼤家去写⼀个队列算法。
那今天我把这节课的内容以⽂章的形式分享出来,⽅便⼤家灵活去学习。
⼀、通过这篇⽂章你能掌握以下知识:
1. 掌握队列的原理和作⽤
2. 掌握队列的设计思路
3. 掌握队列代码编写
4. 掌握队列在产品中的应⽤
⼆、队列的原理和作⽤
1.队列原理
队列原理其实就像⼀个管道,如果我们不断往管道⾥⾯塞乒乓球,每个乒乓球在管道⾥就会排成⼀条队形。
先进去的乒乓球就会先出来,这个就是队列⾥先进先出的规则。我们看下这个图
球从左边进去,进去的动作叫⼊列。
然后进去的球在管道⾥排成⼀个队列,这个叫队列缓存,说⽩了就是数组,那么这⾥存了5个球就相当于是buff[5]。
最右边出来的1号球是最早进去的球,这个出来的动作叫出列,所以遵循
了先进先出的规则。
2.队列作⽤
队列最主要的作⽤啊是⽤来管理数据流的,防⽌数据因为传输频率过快得不到及时处理⽽丢失。
⽐⽅说串⼝接收数据,我们⼀般定义⼀个数组来存储数据,但是数组存储程序写起来没那么⽅便,需要有⼀些变量来记录数组当前可存储的下标,移植性各⽅⾯性能都⽐较差。
最容易上手的编程语言假如串⼝数据频率很快,可能这个数组⾥存储的数据还没处理完,下⼀组串⼝数据⼜过来了,那么这时候数组⾥的数据就会被新数据覆盖,导致⽼的数据丢失。
这就是实际产品开发当中会经常碰到的⼀些痛点。
所以需要⼀种技术或者算法去解决这个问题,把实现能解决这些痛点的代码更好地封装起来,同时保证很好的移植性和可扩展性、还有灵活性。
这个时候队列算法就派上⽤场了。
像这种就可以通过队列的⽅式来处理,每收到⼀个字节数据都先⼊列,然后在应⽤程序同步解析处理,根据队列先进先出的规则,那么⽼的数据就不会被新的数据“插队”了。
这⾥只是说出了队列的其中⼀个应⽤,实际上队列的作⽤还有⾮常多,⽐如可以⽤来传递信号,参数等等。
更多的实⽤性应⽤可以跟⽆际单⽚机编程从实际产品中去学习。
三、队列程序设计思路
其实实现队列的⽅法有很多种,不同的⼯程师实现的代码不⼀样。
但是原理都是⼀样的,我们要编写代码,⾸先要很清楚队列的⼯作原理,这个我们上⾯已经讲了,那么我们这⾥来总结队列的3个核⼼关键点:
1.队列缓存
2.⼊列
3.出列
⼀个队列是不是基本需要这3个必要的操作?
1.队列缓存
那么队列缓存很好理解,说⽩了就是直接定义⼀个数组,数组⼤⼩就是队列缓存的⼤⼩。
数组越⼤,队列缓存就越⼤,能存储的数据就越多,数据传输也越稳定。
⼊列就是把1个或若⼲个数据按顺序存到队列缓存数组⾥,同样出列把数据从队列缓存⾥取出来。
⼊列和出列的原理懂了,那么我们接下来就要思考⼀个⼤家最关⼼的问题:⼊列和出列怎么⽤程序来实现呢?
2.⼊列
根据我们前⾯的理论,⼊列其实就是把数据存进数组的操作,我们平时存数组⼀般都是buff[0]=1;这样操作。
那么⼊列其实没那么简单,因为要考虑队列缓存⾥⾯当前存了多少个数据的情况。
如果有数据,那么我们就不能从[0]这个下标开始⼊列,所以我们在⼊列时要考虑2个问题:
.①队列缓存可以存储的数组下标位置,这个我们⼀般称为队尾。
②队列是否已满,如果队列缓存满了⼜有新的数据⼊列,该怎么处理?这⾥我们⼀般处理⽅式是按照
时间顺序,把最早⼊列的数据丢弃,以新的数据替换。
那么第2个问题呢我们暂时先不管,我们来看下第1个问题。
我们前⾯的⽂章学过数组与指针,通过指针的特性,我们在⽤1个指针变量来代表队尾指针,初始化的时候这个队尾指针指向队列缓存数组的⾸地址。
当⼊列1个数据时,我的队尾指针就加1,这样是不是就能够知道当前队列缓存的存储可位置地址了?
2.出列
数据⼊列以后⾃然要取出来,那么我们取的时候呢也是有原则的,不能乱取,⽽是从最早⼊列那个数据的地址开始取。
所以这个出列的数组下标我们称为队头指针,同样的我们可以使⽤指针变量来代表队头。
上图是⼀个出列的流程,我们这个是满编队的队列。
总共有1,2,3,4,5个数据,那么队头指针指向队列缓存⾸地址,接着第⼀个出列的就是数据1。
出列后对头指针加1,就指向了数据2的地址,那么数据2出列后,对头指针⼜加1,指向数据3的地址,以此类推,这样就能实现先进先出的原则。
三、队列算法代码编写
1.定义队列对象
⼤家发现了没,不管是⼊列、还是出列,这些操作都是基于队列这个对象来操作的。
所以,我们先要把队列当做⼀个对象给定义出来:
通过结构体来封装⼀个对象再合适不过了。
⼀个队列的结构体包含3个东西:队头指针、队尾指针、队列缓存。
当然,这个队列缓存还可以根据你的实际产品应⽤定义不同的⼤⼩。
2.⼊列算法
⼊列算法根据前⾯的理论部分编写,代码经过了批量产品的验证。
这⾥就不详细解释了,有配套的视频讲解的更详细,要的可以⽆际单⽚机编程获取。
⼊列和出列之前必须注意要进⼊临界和退出临界。
进⼊临界的意思就是把单⽚机的总中断关闭,退出临界就是恢复进⼊临界之前的中断状态。
3.出列算法
⼤家如果仔细看,不管是⼊列还是出列,都是对结构体的成员进⾏操作。
所以,c语⾔玩到后⾯真的也就是⾯向对象的编程思维。
那出列对应的讲解我们也有配套视频,这⾥就不再重复了,免得⼤家看得头疼。
4.其他注意
在使⽤队列前,⼀定要把队头指针和队尾指针指向队列缓存第⼀个元素的地址,否则会引起程序崩溃。
1.我现在做串⼝数据流接收基本都会⽤
2.传递重要消息(数据)的时候
还有其他的这⾥就不多说了,等⼤家学会了以后⾃然能扩展更多应⽤。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论