手把手教你c语言队列实现代码,通俗易懂超详细!

举报
无际单片机编程 发表于 2021/10/18 23:45:19 2021/10/18
【摘要】 大家好,我是无际。 近期我们无际单片机编程分享的高级程序架构教程受到了很多粉丝们的高度好评和认可。 这个教程只要用心看的都能体会到里面巨大的价值,特别是工作经验在2-3年的。 我们整个教程里面有一章节是手把手教大家去写一个队列算法。 那今天我把这节课的内容以文章的形式分享出来,方便大家灵活去学习。 一、通过这篇文章你能掌握以下...

大家好,我是无际。

近期我们无际单片机编程分享的高级程序架构教程受到了很多粉丝们的高度好评和认可。

这个教程只要用心看的都能体会到里面巨大的价值,特别是工作经验在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.传递重要消息(数据)的时候

还有其他的这里就不多说了,等大家学会了以后自然能扩展更多应用。

文章来源: blog.csdn.net,作者:无际单片机编程,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_43982452/article/details/118757536

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。