C语言(队列)

1、队列的原理和作用

1、1 队列的原理

队列的原理其实就像一个管道,如果我们不断的往管道里塞乒乓球,每个乒乓球在管道里就会排列一条队列,先进去的乒乓球会先出来,这个就是队列先进先出的规则

球从左边进去的动作叫入列,然后进去的球在管道里排成一个队列,这个叫队列缓存,说白了就类似于一个数组,那么存了五个球就相当于是buff5;这样的意思,从最右边出来的球也是进去最早的球,这个动作也叫出列,所以遵循了先进先出的规则

1、2 队列的作用

队列最主要的作用就是用来缓存数据,比方说串口接收数据,我们一般定义一个数组来存储数据,但是假如串口数据频率很快,可能这个数组里存储的数据还没处理完,下一组数据又过来了,那么这时候数组里的数据就会被新数据覆盖,导致老数据丢失,像这样就可以通过队列的方式来处理,每收到一个字节的数据都先入列,然后在应用程序同步解析处理,根据先进先出的规则那么老的数据就不会被新的数据覆盖了

基于这样的缓存数据的技术,可以灵活应用在各种场景,例如说大数据处理,操作系统的消息传递等等

2、队列程序的设计思路

其实实现队列的方法有很多种,但是工作原理都是一样的,我们要编写代码,首先要很清楚队列的工作原理,那么我们这里总结队列的三个核心关键点:

1、队列缓存

2、入列

3、出列

一个队列是不是基本需要这三个必要的操作,那么队列缓存很好理解,就是定义一个数组,数组大小就是队列缓存的大小,入列就是把一个或若干数据按照顺序存到队列缓存数组里,同样出列就是把数据从队列缓存里按顺序取出来,那么原理我们懂了,接下来思考一个问题,入列和出列怎么用程序实现

2、1 入列操作

根据我们前面的理论,入列其实就是把数据存进数组的操作,我们平时存数组一般都是buff0=i;这种操作,那么入列其实也没那么简单,因为要考虑队列里当前存在多少个数据的情况,如果有数据,那么我们就不能从0这个下标开始入列,所以我们在入列时要考虑两个问题

1、队列缓存可以存储的数组下标位置,我们这个一般称为队尾

2、队列是否已满,如果队列缓存满了又有新的数据入列,该怎么处理?这里我们一般处理方式是按照时间顺序,把最早入列的数据丢弃,以新的数据替换

那么第二个问题我们先暂时不管,我们来看第一个问题,我们前面的课程学过数组与指针,通过指针的特性,我们在用一个指针变量表示队尾,然后通过这个队尾指针指向队列缓存数组的首地址,当入列一个数据时,我的队尾指针就加1,这样就能知道当前队列缓存的可存储位置地址了

2、2 出列操作

数据入列以后自然要取出来,那么我们取的时候呢也是有原则的,不能乱取,而是从最早入列那个数据的地址开始取,所以这个出列的数组下标我们称为队头,同样的我们可以使用指针变量来代表队头

我们看下下面这个图是一个出列的流程,我们这个是满编队的队列,总共有五个数据,那么队头指针指向队列缓存首地址,接着第一个出列的就是数据1,出列后队头指针+1,就指向了数据2的地址,那么数据2出列后,队头指针又+1,以此类推,就能实现先进先出的操作

相关推荐
djarmy2 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
HEJOO93 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧3 小时前
Java:no content to map due to end of input
java·开发语言
梦梦代码精3 小时前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
隔窗听雨眠3 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
David猪大卫3 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
charlie1145141913 小时前
现代Qt开发之图像处理进阶:像素操作与格式转换
开发语言·图像处理·qt
李永奉4 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
秦老师Q4 小时前
php零基础入门到实战,从语法到框架,一篇搞定
开发语言·php
驭渊的小故事5 小时前
多线程02
java·开发语言·jvm