循环队列

  • 头文件queue.h
  • 源文件queue.c
  • 函数调用方法

Note:

  本代码用C语言编写,已经用于实际的项目中,在队列的申请过程中,也进行错误判断,可通过错误判断函数中枚举类型的值来判断,队列哪个过程出现错误。此外对于使用c++的朋友,本人建议将该数据结构封装成一个类来使用,将其操作函数变成成员函数,变量改为私有变量。(并发操作过程中,应给队列加锁,如在结构体或类中定义锁机制)


头文件queue.h

#ifndef _QUEUE_H
#define _QUEUE_H
typedef unsigned char  Q_U8Data;
typedef unsigned short Q_U16Data;
typedef unsigned int   Q_U32Data;typedef struct _tQueueInfo
{Q_U8Data *pDataBuf;Q_U16Data MaxQueueSize;Q_U32Data Front;Q_U32Data Rear;Q_U32Data QueueLength;
}QueueInfo, *pQueueInfo;void Queue_Init(pQueueInfo pQInfo,Q_U16Data MaxSize);
void Queue_ClearData(pQueueInfo pQInfo);
Q_U32Data Queue_GetLength(pQueueInfo pQInfo);
void Queue_AddData(Q_U8Data *pSrcBuf, pQueueInfo pQInfo, Q_U16Data DataCnt);
void Queue_AddOneData(Q_U8Data SrcData, pQueueInfo pQInfo);
void Queue_GetData(Q_U8Data *pBuf, pQueueInfo pQInfo, Q_U32Data DataCnt);
void Queue_GetOneData(Q_U8Data *DestData, pQueueInfo pQInfo);
void  Queue_DummyRead(pQueueInfo pQInfo,Q_U16Data DataCnt);#endif

源文件queue.c

#include "queue.h"
#include "malloc.h"
#include "delay.h"
#include <stdio.h>
#include <string.h>
#include "comm.h"//*****************************错误处理部分*****************
enum ERROR_CODE
{ERR_QUEUE_MALLOC_FAIL = 1,ERR_QUEUE_DATA_FULL,ERR_QUEUE_DATA_NULL,ERR_MALLOC_FAIL,ERR_COMM_MALLOC_FAIL,ERR_NAND_MALLOC_FAIL,ERR_UPAN_WRITE_FAIL,ERR_UPAN_CLOSE_FAIL,ERR_UPAN_OPEN_FAIL,ERR_NAND_BADBLOCK_FULL,ERR_MAINPROC_FAIL,ERR_BBM_MALLOC_FAIL,
};void ErrorHandle(U32 u32ErrCode)
{while(1){//        Led_Error();printf("error code = %x \r\n", u32ErrCode);DelayMs(500);// COMM_WriteCmd(COMM_MAINCMD_CONTROL,COMM_SUBCMD_CONTROL_ERROR);DelayMs(500);}
}
//*****************************错误处理部分*****************void Queue_Init(pQueueInfo pQInfo,Q_U16Data MaxSize)
{Q_U8Data *pBuf;pBuf = mymalloc(SRAMIN,MaxSize);if(pBuf == NULL){ErrorHandle(ERR_QUEUE_MALLOC_FAIL);}pQInfo->pDataBuf = pBuf;pQInfo->MaxQueueSize = MaxSize;pQInfo->Front = 0;pQInfo->Rear = 0;pQInfo->QueueLength = 0;
}void Queue_ClearData(pQueueInfo pQInfo)
{pQInfo->Front = 0;pQInfo->Rear = 0;pQInfo->QueueLength = 0;
}Q_U32Data Queue_GetLength(pQueueInfo pQInfo)
{Q_U32Data Ret;Ret = (pQInfo->Rear - pQInfo->Front + (pQInfo->MaxQueueSize)) % (pQInfo->MaxQueueSize);   //取余是当Real < Front时return Ret;
}/******************数据空间************************| ---------- | ------------- | ---------------- | 0          Front            Rear               256该数据空间大小申请的是256,数据以头尾相连的方式进行存取,
函数首先判断的是存入的空间是否足够,即除开front--rear段,
剩下的空间是否足够存入buf,其次开始存入时,先按顺序存入
在rear到256的数据段,最后存入的是0--front的数据段。
****************************************************/
void Queue_AddData(Q_U8Data *pAddBuf, pQueueInfo pQInfo, Q_U16Data DataCnt)
{Q_U16Data u16QCnt;Q_U16Data u16QLen;u16QLen = (pQInfo->Rear - pQInfo->Front + (pQInfo->MaxQueueSize)) % (pQInfo->MaxQueueSize);if(u16QLen + DataCnt > pQInfo->MaxQueueSize)//判断是否超出256 {while(1){printf("Queue Size is overflow!In src:%s Line:%d\r\n",__FILE__,__LINE__);DelayMs(100);}}else{u16QCnt = (pQInfo->MaxQueueSize) - pQInfo->Rear;//计算Rear后可存空间(剩余的就是Front前可存空间)if(u16QCnt >= DataCnt)//front--rear段足够存下{memcpy(pQInfo->pDataBuf + pQInfo->Rear, pAddBuf, DataCnt);}else//分两段存,先是front--rear段,然后是0--front段{memcpy(pQInfo->pDataBuf + pQInfo->Rear, pAddBuf, u16QCnt);memcpy(pQInfo->pDataBuf, pAddBuf + u16QCnt, DataCnt - u16QCnt);}pQInfo->Rear = (pQInfo->Rear + DataCnt)%(pQInfo->MaxQueueSize);pQInfo->QueueLength += DataCnt;}
}void Queue_GetData(Q_U8Data *pSaveBuf, pQueueInfo pQInfo, Q_U32Data DataCnt)
{Q_U16Data u16QCnt;Q_U16Data u16QLen;u16QLen = (pQInfo->Rear - pQInfo->Front + (pQInfo->MaxQueueSize)) % (pQInfo->MaxQueueSize);if(u16QLen < DataCnt){while(1){printf("Queue is not enough data to read!In src:%s Line:%d\r\n",__FILE__,__LINE__);DelayMs(100);}}else{u16QCnt = (pQInfo->MaxQueueSize) - pQInfo->Front;if(u16QCnt >= DataCnt){memcpy(pSaveBuf, pQInfo->pDataBuf + pQInfo->Front, DataCnt);}else{memcpy(pSaveBuf, pQInfo->pDataBuf + pQInfo->Front, u16QCnt);memcpy(pSaveBuf + u16QCnt, pQInfo->pDataBuf, DataCnt - u16QCnt);}}pQInfo->Front = (pQInfo->Front + DataCnt)%(pQInfo->MaxQueueSize);pQInfo->QueueLength -= DataCnt;
}//丢弃数据函数
//在队列里移动Front,模拟读出的过程移动Front,但是没有Buf接收,形成丢弃
void Queue_DummyRead(pQueueInfo pQInfo,Q_U16Data DataCnt)
{Q_U16Data u16QLen;u16QLen = (pQInfo->Rear - pQInfo->Front + (pQInfo->MaxQueueSize)) % (pQInfo->MaxQueueSize);if(u16QLen < DataCnt){while(1){printf("Queue is not enough data to read!In src:%s Line:%d\r\n",__FILE__,__LINE__);DelayMs(100);}else{pQInfo->Front = (pQInfo->Front + DataCnt)%(pQInfo->MaxQueueSize);pQInfo->QueueLength -= DataCnt;}
}

函数调用方法

QueueInfo    Q_UART1Info;         //定义一个队列结构体
Queue_Init(&Q_UART1Info, 256);   //初始化队列结构体,并设置其最大为256个字节if(Queue_GetLength(&Q_UART1Info) > 100)
{//队列中的数据长度 > 100个字节时才进行处理Queue_GetData(...);
}

C语言_循环队列具体实现相关推荐

  1. C语言查看队头元素,C语言实现循环队列的初始化进队出队读取队头元素判空-1...

    目前,处在学习数据结构+ing,由于之前学过了队列,今天就把自己写过的代码做了一些完善分享给大家,希望能够帮助到有需要的朋友,有不足的地方欢迎大家交流    φ(゜▽゜*)♪ 队列是另一种限定性的线性 ...

  2. 字符串队列c语言,C语言实现循环队列(队列可存储字符串)

    项目原因,需要写一个队列来存储串口实时输出的字符串.看了网上很多博文和一些数据结构的数据,给的例子都是实现对单个数字或者字符的队列操作,并没有实现在队列中存储字符串.这里分享一种可以实现的方法. 关于 ...

  3. c语言while队列不为空,C语言实现循环队列的初始化进队出队读取队头元素判空-2...

    /*顺序表实现队列的一系列操作(设置flag标志不损失数组空间)*/ #include #include #define Queue_Size 50 //队列的最大长度 #define OK 1 #d ...

  4. 环形队列的输出_循环队列的基本操作详细讲解

    实验学时: 2 实验类型: (设计型) 一.实验目的 1. 理解并掌握队列的逻辑结构和顺序存储结构,了解循环队列的特点: 2. 掌握循环队列中基本操作的相关算法: 3. 编程实现相关算法: 4. 学会 ...

  5. 顺序循环队列类c#语言,C#--循环队列的顺序存储

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  6. c语言变量循环队列的遍历操作,C语言实现循环队列

    对于循环队列有几个操作: 1.初始化 2.入队 3.出队 4.遍历队列 5.判队列空,判队列满 具体如何实现,我会在下面通过代码实现 在对循环队列操作之前,先要建立队列结构体元素, 1 typedef ...

  7. java循环队列入队出队算法_循环队列实现

    生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题:从生活中,可以抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结构 ...

  8. 数据结构c语言循环队列代码,数据结构C语言实现----循环队列

    代码如下: #include #include typedef char ElemType; #define MAXQUEUE 100 typedef struct { ElemType *base; ...

  9. java循环队列配对_循环队列 链式队列 的jJAVA实现

    对节点的移除插入删除操作,一定要注意在表头和表尾边界进行处理的过程 出队列时 注意只有一个元素的情况,此时队尾和对头指针应该都为空,别忘了修改队尾指针. class CircleQueue { pri ...

  10. c语言 数据结构 循环队列

    #include<stdio.h> #include<stdlib.h> #define QueueSize 100 typedef char DataType; typede ...

最新文章

  1. 够快云库, 加速企业信息化建设
  2. 第五章 随机事件及其概率
  3. 用户代码未处理nullreferenceexception_CSAPP 第九章整理 未完成
  4. 模块化程序设计(多文件编程)介绍
  5. 【SimpleITK】分割结果融合策略
  6. Python语言编写有趣练习题!
  7. bzoj4567: [Scoi2016]背单词
  8. java大数阶乘_Java大数阶乘
  9. Python飞机大战游戏 附素材及源码
  10. 密码技术学习(8.1)-数字证书简介
  11. 计算机考证广东省ps
  12. windows事件查看器
  13. 数学智力题 武士数独题目_最新智力题大全及答案-各种最新IQ题目推荐-第1595页-33IQ...
  14. LLJ-F(S)系列漏电继电器
  15. 【笔记】设计模式 | 5种设计模式笔记整理
  16. PON、EPON、GPON的区别
  17. hdu4417:线段树单点更新区间求和,离线 Super Mario
  18. 托福阅读基础训练方法
  19. 前端加密中文,后端解密java
  20. 坐标正算和坐标反算的c语言,坐标正算程序坐标反算程序

热门文章

  1. 叔叔阿姨,我真的不会修电脑
  2. UCweb等手机浏览器的盈利模式
  3. 从打字机效果的 N 种实现看JS定时器机制和前端动画
  4. 使用java.lang.String报错之Expected 0 arguments but found 1
  5. 空军资深战略研究员:房地产支撑不起大国崛起
  6. 关于library cache lock
  7. vue中报warnings potentially fixable with the `--fix` option.
  8. unity详细解决visualstudio未能找到类型或命明空间名问题
  9. MIN-MAX归一化
  10. 中国哲学简史 读书笔记