返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言队列怎么用
  • 829
分享到

C语言队列怎么用

2023-06-29 09:06:54 829人浏览 安东尼
摘要

这篇文章主要介绍C语言队列怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.队列的原理队列原理其实就像一个管道,如果我们不断往管道里面塞乒乓球,每个乒乓球在管道里就会排列一条队形。先进去的乒乓球就会先出来,这个

这篇文章主要介绍C语言队列怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!


1.队列的原理

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

C语言队列怎么用

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

2.队列的作用

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

基于这种缓存数据的技术,可以灵活应用在各种场景,比如说:

3.队列程序设计思路

其实实现队列的方法有很多种,但是工作原理都是一样的,我们要编写代码,首先要很清楚队列的工作原理。

  • 队列缓存

  • 入列

  • 出列

  • 一个队列基本上要有上面这三个必要的操作,那么队列缓存就很好理解,说白了就是直接定义一个数组,数组大小就是队列缓存的大小。入列就是把1个或者若干个数据按顺序存到队列缓存数组里,同样出列把数据从队列缓存里取出来。

入列和出列的原理懂了,那么应该怎么样用程序来实现呢?

4.入列

根据上文的说法,入列就是把数据存进数组的操作,我们平时存数组一般都是buff[0]=1;这样操作。不过在队列中我们要考虑队列里当前存在多少个数据的情况,如果有数据,那么我们就不能从[0]这个下标开始入列,所以我们在入列时要考虑两个问题:

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

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

丢弃,以新的数据替换。
第二个问题先暂时不管,先看第一个问题。根据前面学过的数组与指针,通过指针的特性,我们在用1个指针来代表队尾,然后这个队尾指针指向队列缓存数组的首地址,当入列1个数据时,我们的队尾指针就+1,这样是不是就能够知道当前队列缓存的可以存储的地址了?

C语言队列怎么用

5.出列

数据入列以后自然要取出来,那么我们取的时候也是有原则的,不能乱取,而是从最早入列那个数据的地址开始取,所以这个出列的数组下标我们称为队头,同样我们可以使用指针变量来代表这个队头。
我们看看下面这个图是一个出列的流程,我们这个是满编队的队列,总共有1,2,3,4,5个数据,那么队头指针指向队列缓存首地址,接着第一个出列的就是数据1,出列后队头指针加1,就指向数据2的地址,那么数据2出列后,队头指针又加1,指向数据3的地址,以此类推,这样就可以实现先进先出的原则。

C语言队列怎么用

6.掌握队列程序编写

那么我们知道原理后就可以用程序来实现它了,因为一个产品中,会有很多队列代表不同的数据,比如说消息我有一个队列,底层串口接收我也有一个队列,所以我们吧队列的一些操作,比如说入列,出列的操作单独写成函数接口,方便程序不同区域的调用。

#include <stdio.h>#include "Queue.h"Queue4 KeyMsg;int main(int arGC, char *argv[]){    unsigned char a;     QueueEmpty(KeyMsg);    printf("site:%d\r\n",sizeof(KeyMsg.Buff));     printf("&KeyMsg=0x%x, KeyMsg.Buff=0x%x, KeyMsg.Head=0x%x, KeyMsg.Tail=0x%x\r\n",&KeyMsg,KeyMsg.Buff,KeyMsg.Head,KeyMsg.Tail);    printf("&buff[0]=0x%x, &buff[1]=0x%x, &buff[2]=0x%x, &buff[3]=0x%x \r\n",&KeyMsg.Buff[0],&KeyMsg.Buff[1],&KeyMsg.Buff[2],&KeyMsg.Buff[3]);    printf("\r\n");         a = 1;    QueueDataIn(KeyMsg,&a,1);    printf("&KeyMsg=0x%x, KeyMsg.Buff=0x%x, KeyMsg.Head=0x%x, KeyMsg.Tail=0x%x\r\n",&KeyMsg,KeyMsg.Buff,KeyMsg.Head,KeyMsg.Tail);    printf("buff[0]=0x%x, buff[1]=0x%x, buff[2]=0x%x, buff[3]=0x%x \r\n",KeyMsg.Buff[0],KeyMsg.Buff[1],KeyMsg.Buff[2],KeyMsg.Buff[3]);    printf("\r\n");         a = 2;    QueueDataIn(KeyMsg,&a,1);    printf("&KeyMsg=0x%x, KeyMsg.Buff=0x%x, KeyMsg.Head=0x%x, KeyMsg.Tail=0x%x\r\n",&KeyMsg,KeyMsg.Buff,KeyMsg.Head,KeyMsg.Tail);    printf("buff[0]=0x%x, buff[1]=0x%x, buff[2]=0x%x, buff[3]=0x%x \r\n",KeyMsg.Buff[0],KeyMsg.Buff[1],KeyMsg.Buff[2],KeyMsg.Buff[3]);    printf("\r\n");         a = 3;    QueueDataIn(KeyMsg,&a,1);    printf("&KeyMsg=0x%x, KeyMsg.Buff=0x%x, KeyMsg.Head=0x%x, KeyMsg.Tail=0x%x\r\n",&KeyMsg,KeyMsg.Buff,KeyMsg.Head,KeyMsg.Tail);    printf("buff[0]=0x%x, buff[1]=0x%x, buff[2]=0x%x, buff[3]=0x%x \r\n",KeyMsg.Buff[0],KeyMsg.Buff[1],KeyMsg.Buff[2],KeyMsg.Buff[3]);    printf("\r\n");         a = 4;    QueueDataIn(KeyMsg,&a,1);    printf("&KeyMsg=0x%x, KeyMsg.Buff=0x%x, KeyMsg.Head=0x%x, KeyMsg.Tail=0x%x\r\n",&KeyMsg,KeyMsg.Buff,KeyMsg.Head,KeyMsg.Tail);    printf("buff[0]=0x%x, buff[1]=0x%x, buff[2]=0x%x, buff[3]=0x%x \r\n",KeyMsg.Buff[0],KeyMsg.Buff[1],KeyMsg.Buff[2],KeyMsg.Buff[3]);    printf("\r\n");         a = 5;    QueueDataIn(KeyMsg,&a,1);    printf("&KeyMsg=0x%x, KeyMsg.Buff=0x%x, KeyMsg.Head=0x%x, KeyMsg.Tail=0x%x\r\n",&KeyMsg,KeyMsg.Buff,KeyMsg.Head,KeyMsg.Tail);    printf("buff[0]=0x%x, buff[1]=0x%x, buff[2]=0x%x, buff[3]=0x%x \r\n",KeyMsg.Buff[0],KeyMsg.Buff[1],KeyMsg.Buff[2],KeyMsg.Buff[3]);    printf("\r\n");         printf("&KeyMsg=0x%x, KeyMsg.Buff=0x%x, KeyMsg.Head=0x%x, KeyMsg.Tail=0x%x\r\n",&KeyMsg,KeyMsg.Buff,KeyMsg.Head,KeyMsg.Tail);    QueueDataOut(KeyMsg,&a);    printf("a=%d\r\n",a);     printf("&KeyMsg=0x%x, KeyMsg.Buff=0x%x, KeyMsg.Head=0x%x, KeyMsg.Tail=0x%x\r\n",&KeyMsg,KeyMsg.Buff,KeyMsg.Head,KeyMsg.Tail);    printf("buff[0]=0x%x, buff[1]=0x%x, buff[2]=0x%x, buff[3]=0x%x \r\n",KeyMsg.Buff[0],KeyMsg.Buff[1],KeyMsg.Buff[2],KeyMsg.Buff[3]);    printf("\r\n");         return 0;}

queue.c代码

void S_QueueEmpty(unsigned char **Head,unsigned char **Tail,unsigned char *pBuff){    *Head = pBuff;    *Tail = pBuff; }void S_QueueDataIn(unsigned char **Head,unsigned char **Tail,unsigned char *pBuff,unsigned char Len,unsigned char *pData,unsigned char DataLen){    unsigned char num;    //关闭中断     for(num=0; num < DataLen; num++,pData++)    {            **Tail = *pData;        //这里把数据入列         (*Tail)++;                //队尾指针加1         if(*Tail == pBuff+Len)         {             *Tail = pBuff;          }        if(*Tail == *Head)        {                        if(++(*Head) == pBuff+Len)            {                *Head = pBuff;                }        }    }    //打开中断 }unsigned char S_QueueDataOut(unsigned char **Head,unsigned char **Tail,unsigned char *pBuff,unsigned char Len,unsigned char *pData){    unsigned char status;    //关闭中断     status = 0;    if(*Head != *Tail)    {        *pData = **Head;        status = 1;        if(++(*Head) == pBuff+Len)        {            *Head = pBuff;        }    }    //恢复中断     return status;}unsigned short S_QueueDataLen(unsigned char **Head,unsigned char **Tail,unsigned char *pBuff,unsigned char Len){    if(*Tail > *Head)    {        return *Tail-*Head;    }    if(*Tail < *Head)    {        return *Tail+Len-*Head;        }}

queue.h代码

#ifndef _QUEUE_H_#define _QUEUE_H_extern void S_QueueEmpty(unsigned char **Head,unsigned char **Tail,unsigned char *pBuff);extern void S_QueueDataIn(unsigned char **Head,unsigned char **Tail,unsigned char *pBuff,unsigned char Len,unsigned char *pData,unsigned char DataLen);extern unsigned char S_QueueDataOut(unsigned char **Head,unsigned char **Tail,unsigned char *pBuff,unsigned char Len,unsigned char *pData); extern unsigned short S_QueueDataLen(unsigned char **Head,unsigned char **Tail,unsigned char *pBuff,unsigned char Len); #define QueueEmpty(x)  S_QueueEmpty((unsigned char **)&(x).Head,(unsigned char **)&(x).Tail,(unsigned char *)(x).Buff)#define QueueDataIn(x,y,z) S_QueueDataIn((unsigned char **)&(x).Head,(unsigned char **)&(x).Tail,(unsigned char *)&(x).Buff,sizeof((x).Buff),y,z)#define QueueDataOut(x,y)  S_QueueDataOut((unsigned char **)&(x).Head,(unsigned char **)&(x).Tail,(unsigned char *)&(x).Buff,sizeof((x).Buff),y)#define QueueDataLen(x)     S_QueueDataLen((unsigned char **)&(x).Head,(unsigned char **)&(x).Tail,(unsigned char *)&(x).Buff,sizeof((x).Buff)) typedef struct{    unsigned char *Head;     //队头指针,用来出列用的     unsigned char *Tail;     //队尾指针,用来入列用的     unsigned char Buff[4];    //队列缓存 }Queue4;typedef struct{    unsigned char *Head;     //队头指针,用来出列用的     unsigned char *Tail;     //队尾指针,用来入列用的     unsigned char Buff[128];    //队列缓存 }Queue128;typedef struct{    unsigned char *Head;     //队头指针,用来出列用的     unsigned char *Tail;     //队尾指针,用来入列用的     unsigned char Buff[512];    //队列缓存 }Queue512;#endif

7.队列的应用

串口的应用:

C语言队列怎么用

C语言队列怎么用

如果产品有两个功能,一个功能需要灯一秒闪1次,另一个功能需要灯1秒闪2次,在功能切换很快的情况下,需要功能正常并且灯的闪烁正常,那么就需要队列了。

以上是“C语言队列怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网其他教程频道!

--结束END--

本文标题: C语言队列怎么用

本文链接: https://lsjlt.com/news/324100.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言队列怎么用
    这篇文章主要介绍C语言队列怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.队列的原理队列原理其实就像一个管道,如果我们不断往管道里面塞乒乓球,每个乒乓球在管道里就会排列一条队形。先进去的乒乓球就会先出来,这个...
    99+
    2023-06-29
  • C语言队列怎么实现
    今天小编给大家分享一下C语言队列怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。队列的实现基本概念队列:只允许在一端进...
    99+
    2023-06-29
  • C语言链式队列与循环队列怎么实现
    这篇文章主要介绍了C语言链式队列与循环队列怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言链式队列与循环队列怎么实现文章都会有所收获,下面我们一起来看看吧。队列的实现队列是一种先进先出(First ...
    99+
    2023-06-30
  • c语言环形队列
    #include #include #include #include #include #include #include #define BUFFER_SIZE 256 * 1024#define...
    99+
    2023-10-10
    c语言 开发语言
  • c语言如何调用队列
    c语言中创建和操作队列:使用queue_create()创建一个队列。使用queue_enqueue()将元素添加到队列末尾。使用queue_dequeue()从队列头部移除元素。使用q...
    99+
    2024-05-22
    c语言 标准库
  • C语言怎么实现栈和队列
    本文小编为大家详细介绍“C语言怎么实现栈和队列”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么实现栈和队列”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是栈栈:一种特殊的线性表,其只允许在固定的一端...
    99+
    2023-06-30
  • C语言队列和应用详情
    目录1.队列的原理2.队列的作用3.队列程序设计思路4.入列5.出列6.掌握队列程序编写7.队列的应用1.队列的原理 队列原理其实就像一个管道,如果我们不断往管道里面塞乒乓球,每个乒...
    99+
    2024-04-02
  • go语言redis队列怎么应用
    Go语言中使用Redis队列主要有两种应用场景:消息队列和任务队列。1. 消息队列:消息队列常用于异步通信和解耦系统组件。使用Red...
    99+
    2023-08-31
    go语言 redis
  • go语言怎么使用redis队列
    在Go语言中使用Redis队列可以通过以下步骤: 安装redis-go客户端库:首先需要安装Go语言的Redis客户端库,可以使用...
    99+
    2024-04-09
    go语言 redis
  • C语言如何实现队列
    这篇文章主要介绍了C语言如何实现队列的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言如何实现队列文章都会有所收获,下面我们一起来看看吧。一. 什么是队列队列是一种特殊的线性表,特殊之处在于它只允许在表的前端...
    99+
    2023-07-02
  • C语言栈与队列怎么相互实现
    本篇内容介绍了“C语言栈与队列怎么相互实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、本章重点用两个队列实现栈用两个栈实现队列解题思路...
    99+
    2023-06-29
  • C语言中用栈+队列实现队列中的元素逆置
    下面举例代码: 提到的Q是一个队列,S是一个空栈,实现将队列中的元素逆置的算法 #include<stdio.h> #define MaxSize 10 typedef ...
    99+
    2024-04-02
  • C语言循环队列与用队列实现栈问题解析
    目录循环队列题目描述题目链接思路分析代码实现用队列实现栈题目描述题目链接思路分析代码实现循环队列 循环队列: 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并...
    99+
    2024-04-02
  • C语言数据结构系列队列篇
    目录一、队列(Queue)0x00 队列的概念0x01 队列的结构二、队列的定义0x00 链式队列0x02 接口函数三、队列的实现0x...
    99+
    2024-04-02
  • C语言详解链式队列与循环队列的实现
    目录队列的实现链式队列链式队列的定义链式队列的实现循环队列循环队列的定义循环队列的实现队列的实现 队列是一种先进先出(First in First Out)的线性表,简称FIFO。与...
    99+
    2024-04-02
  • C语言 队列的实现全解析
    目录队列的实现基本概念创建结构体初始化结构体销毁队列结构体入队出队判断队列是否为空访问对头的值访问队尾的值返回队列的长度Queue.hQueue.cTest.c队列的实现 基本概念 ...
    99+
    2024-04-02
  • C语言中队列的示例分析
    这篇文章将为大家详细讲解有关C语言中队列的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、队列(Queue)0x00 队列的概念 概念:① 队列只允许在一端进行插入数据操作,在另一端进...
    99+
    2023-06-29
  • C语言栈与队列如何定义
    今天小编给大家分享一下C语言栈与队列如何定义的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。栈栈的定义栈是一种线性表,但限定这...
    99+
    2023-06-30
  • C语言栈和队列如何实现
    这篇文章主要讲解了“C语言栈和队列如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言栈和队列如何实现”吧!一、栈与队列以及双端队列的概念1.1 栈的概念及结构栈:一种特殊的线性表,...
    99+
    2023-06-30
  • go语言数组怎么实现队列
    在Go语言中,可以使用切片来实现队列。 首先,定义一个结构体来表示队列: type Queue struct { items...
    99+
    2024-02-29
    go语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作