C语言(队列)

1、队列的原理和作用

1、1 队列的原理

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

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

1、2 队列的作用

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

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

2、队列程序的设计思路

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

1、队列缓存

2、入列

3、出列

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

2、1 入列操作

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

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

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

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

2、2 出列操作

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

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

相关推荐
祈安_3 天前
C语言内存函数
c语言·后端
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1235 天前
matlab画图工具
开发语言·matlab
dustcell.5 天前
haproxy七层代理
java·开发语言·前端
norlan_jame5 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone5 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054965 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
czy87874755 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言
遥遥江上月5 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_531237175 天前
C语言-数组练习进阶
c语言·开发语言·算法