对于嵌入式产品来说,会经常的进行数据收发操作。当因为短时间内有多帧数据而处理不过来时,可将数据暂存在缓冲区来做处理。队列和链表是作为缓冲区比较好的方式,链表可指定相应的位置进行增删查改等操作,对于不经常插入和删除数据的操作比较有优势;而队列对于频繁进行FIFO的操作比较有优势。

理解循环队列

    何谓循环队列?首先我们要说明的是循环队列仍然是基于数组实现的。但是为了形象化的说明问题,我们如下图所示

          

    1.图中有两个指针(其实就是两个整数型变量,因为在这里有指示作用,所以这里理解为指针)front、rear,一个指示队头,一个指示队尾。

    2.rear和front互相追赶着,这个追赶过程就是队列添加和删除的过程,如果rear追到head说明队列满了,如果front追到rear说明队列为空。

  说明:

    令队列空间中的一个单元闲置,使得队列非空时,Q.rear与Q.front之间至少间隔一个空闲单。

    3.我们把它掰弯,用的是求余,这样两个值就不会跑出最大范围,并且可以实现弯曲的效果,所以说对于循环队列我们必须给定最大值MAXQSIZE。

       这其实是我们臆想的,反正我们要做的就是利用循环来解决空间浪费的问题。  

循环队列的实现过程

        ☆:当队列添加元素到rear的下一个元素是head的时候,也就是转圈子要碰头了,我们就认为队列满了。(Q.rear+1)%MAXSIZE=Q.front

        ☆:当队列删除元素到head=rear的时候,我们认为队列空了。Q.rear==Q.front,不一定为0

  图示:

    

以下为自己使用过的简单的循环队列的例子函数:

//定义结构体
typedef struct
{
    u8 data[MAXSIZE];   //队列存储区
    u8 front;        //出队标记
    u8 rear;        //入队标记
}sequeue_t;

//创建队列
void init_sequeue(sequeue_t * sq)
{
//    sq = (sequeue_t *)malloc(sizeof(sequeue_t));
     memset(&sq->data[0],0,MAXSIZE);
     sq->front = 0;
     sq->rear = 0;
}

//判断队列是否为空
u8 check_seqeue_empty(sequeue_t * sq)
{
        if(sq->front == sq->rear)
            return TRUE;
        else
            return FALSE;
}

//入队
u8 enqueue(sequeue_t *sq ,u8 val)
{
        /* 判断队列是否满,数组的最后一个存储空间不用 */
        if((sq->rear + 1)%MAXSIZE == sq->front)
            return ERROR;
        sq->data[sq->rear] = val;
        sq->rear = (sq->rear+1) % MAXSIZE;     //循环存储
        return SUCCESS;
}

//入队
u8 dequeue(sequeue_t * sq)
{
    u8 val = 0;
        if( TRUE == check_seqeue_empty(sq))
            return ERROR;
        val = sq->data[sq->front] ;
    sq->front = (sq->front+1) % MAXSIZE;   
    return val;
}

//剩余空间
u8 leftspace(sequeue_t * sq)
{
        u16 val = 0;
        if( sq->front < sq->rear)
            val = MAXSIZE - (sq->rear - sq->front) -1;
        else if(sq->front == sq->rear)
            val = MAXSIZE - 1;
        else
            val = sq->front - sq->rear - 1;
        return val;
}

循环队列的原理及例子相关推荐

  1. 循环队列(Circular Queue)

    循环队列作用 为充分利用向量空间,克服"假溢出"现象的方法. 循环队列的原理 在环状顺序表中,最后一个位置(a[6])和第一个位置(a[0])紧挨着,这样做的好处是: 随着元素做入 ...

  2. Java 循环队列原理与用法详解

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:iphone 也是办公神器,用了就知道了,不行送你一个试试个人原创+1博客:点击前往,查看更多 链接:https ...

  3. 并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究

    并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究 http://www.importnew.com/25668.html 一. 前言 常用的并发队列有阻塞队列和非阻塞队列 ...

  4. 循环队列及C语言实现三

    在之前的博客中给出了设计循环队列的思路以及源码,这些可都是经过我长期大数据测试的验证哦.当然,现在的很多开源项目和一些封装好的类或接口也都有类似的队列实现方法,之所以我还在使用自己写的这一套方法,主要 ...

  5. python循环队列_关于循环队列的一些讲解

    前面讲到了队列的"假溢出",解决假溢出的办法就是后面满了,就再从头开始,也就是头尾相接的循环.我们把队列的这种头尾相接的顺序存储结构称为循环队列. 比如昨天的例子,rear可以改为 ...

  6. 基于数组实现循环队列(基于Java实现)

    title: 基于数组实现循环队列(基于Java实现) tags: 数组 循环队列 基于数组实现循环队列的方法原理: 我们在用数组实现队列的时候,发现当tail = n时,就会有数据搬移的操作,这样一 ...

  7. 数据结构之——队列与循环队列

    数据结构学习之--队列与循环队列 什么是队列(Queue) 队列基于动态数组的实现及时间复杂度分析 优化队列 循环队列(LoopQueue) 什么是队列(Queue) 队列(Queue)同栈(stac ...

  8. JUC多线程:AQS抽象队列同步器原理

    一.AQS 的工作原理: 1.1.什么是 AQS: AQS,Abstract Queued Synchronizer,抽象队列同步器,是 J.U.C 中实现锁及同步组件的基础.工作原理就是如果被请求的 ...

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

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

最新文章

  1. mysql+xml+注释,springboot整合mybatis完整示例, mapper注解方式和xml配置文件方式实现(我们要优雅地编程)...
  2. OpenGL phong lighting冯氏光照的实例
  3. qsort()与sort的用法(收藏)
  4. uni-app 用户地理位置授权
  5. UNIX(进程间通信):16深入理解Socket
  6. java使用ssh下载git代码_使用Java用户名和密码在ssh上克隆git存储库
  7. Spring Boot 学习之配置文件 application.yml
  8. 利用python scapy包进行抓包发包与ARP扫描
  9. 拓端tecdat|R语言生存分析数据分析可视化案例
  10. 【Vegas原创】控制文件损坏,使用trace文件恢复DB
  11. MongoDB官网下载和安装(ZIP安装)
  12. Win11玩红警2黑屏的解决办法
  13. Windows怎么截图
  14. 计算机word文档无法预览,电脑打开Word文档内容显示不全或显示空白怎么解决
  15. quickq官方版下载_Forex Signal
  16. 直击GITC2018 尚德机构苏万松:从消费互联网到产业互联网
  17. Win 11 配置Java环境变量x64位操作系统
  18. 解决Xubuntu任务栏(Panel)消失的问题
  19. 基于java+springboot+mybatis+vue+elementui的火车高铁购票系统
  20. 活性炭去甲醛的原理!

热门文章

  1. 基于C++(QT)的车牌识别实现——二值化处理
  2. linux系统怎么安全杀毒软件,Linux系统用什么杀毒软件 为什么Linux不中毒
  3. Ubuntu配置中科大、清华、163镜像源
  4. udf mysql 重启_lib_mysqludf_json导致mysql重启原因分析
  5. 2021-04-25电气防火限流式保护器在古村建筑消防安全中的应用-安科瑞耿敏花
  6. 01程序设计与C语言
  7. php文件太大怎么办
  8. 她是真正的科学女皇!
  9. Navicat Charts Creator图表工具探索
  10. 正则:高亮多个相似关键词,如京东、京东物流、京东商城…