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,以此类推,就能实现先进先出的操作

相关推荐
weixin_437499924 分钟前
【PHP 构造函数与析构函数:从基础到高级的完整指南】
开发语言·php
Mu.38711 分钟前
加密与安全
java·开发语言
_extraordinary_1 小时前
Java 字符串常量池 +反射,枚举和lambda表达式
android·java·开发语言
睿思达DBA_WGX1 小时前
Python 程序设计讲义(36):字符串的处理方法——去除字符串头尾字符:strip() 方法、lstrip() 方法与rstrip() 方法
开发语言·python
银河码2 小时前
嵌入式linux驱动开发:什么是Linux驱动?深度解析与实战入门
linux·c语言·驱动开发·驱动入门
下页、再停留2 小时前
【PHP】CURL请求第三方API接口
开发语言·php
爱吃KFC的大肥羊2 小时前
C/C++常用字符串函数
c语言·数据结构·c++·算法
阿捏利3 小时前
C Primer Plus 第6版 编程练习——第15章
c语言·c primer plus
阿捏利3 小时前
【加解密与C】HASH系列(四)SHA-3
c语言·加解密·sha-3