当前位置:   article > 正文

2024年C C++最全【C C++开源库】环形队列,消息队列库_开源 queue 库,C C++并发原理解析_c 环形队列

c 环形队列

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

[C语言创建循环缓冲区(环形缓冲区)-- Circular Buffer](https://bbs.csdn.net/topics/618668825)

C语言实现环形缓冲区

环形缓冲区ring_buffer的c语言实现

二、裸机中环形队列与RTOS中消息队列的区别

“环形队列”和“消息队列”在嵌入式领域有应用非常广泛,相信有经验的嵌入式软件工程师对它们都不陌生。
但经常看到一些初学者问一些相关的问题,今天就来分享一下关于“环形队列”和“消息队列”的内容。

环形队列是在实际编程极为有用的数据结构,它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单,能很快知道队列是否满为空,能以很快速度的来存取数据。

环形队列通常用于通信领域,比如UART、USB、CAN、网络等。

内存上没有环形的结构,因此环形队列实上是数组的线性空间来实现。当数据到了尾部它将转回到0位置来处理。
因此环列队列的逻辑:将数组元素q[0]与q[MAXN-1]连接,形成一个存放队列的环形空间。
为了方便读写,还要用数组下标来指明队列的读写位置。head/tail.其中head指向可以读的位置,tail指向可以写的位置。

图片

环形队列的关键是判断队列为空,还是为满。当tail追上head时,队列为满时;当head追上tail时,队列为空。但如何知道谁追上谁,还需要一些辅助的手段来判断. 如何判断环形队列为空,为满有两种判断方法:a.附加一个标志位tag

  • 当head赶上tail,队列空,则令tag=0
  • 当tail赶上head,队列满,则令tag=1

b.限制tail赶上head,即队尾结点与队首结点之间至少留有一个元素的空间。

  • 队列空: head==tail
  • 队列满: (tail+1)% MAXN ==head

a.采用第一个环形队列有如下结构:

typedef struct ringq{
   int head; /\* 头部,出队列方向\*/
   int tail; /\* 尾部,入队列方向\*/ 
   int tag ;
   int size ; /\* 队列总尺寸 \*/
   int space[RINGQ_MAX]; /\* 队列空间 \*/
}RINGQ;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

初始化状态:

q->head = q->tail = q->tag = 0;

  • 1
  • 2

队列为空:

( q->head == q->tail) && (q->tag == 0)

  • 1
  • 2

队列为满 :

 ((q->head == q->tail) && (q->tag == 1))

  • 1
  • 2

入队操作,如队列不满,则写入:

q->tail =  (q->tail + 1) % q->size ;

  • 1
  • 2

出队操作,如果队列不空,则从head处读出。

下一个可读的位置在:

q->head =  (q->head + 1) % q->size

  • 1
  • 2

b.完整代码****头文件ringq.h:

#ifndef \_\_RINGQ\_H\_\_
#define \_\_RINGQ\_H\_\_

#ifdef \_\_cplusplus
extern "C" {
#endif 

#define QUEUE\_MAX 20

typedef struct ringq{
   int head; /\* 头部,出队列方向\*/
   int tail; /\* 尾部,入队列方向\*/ 
   int tag ; /\* 为空还是为满的标志位\*/
    int size ; /\* 队列总尺寸 \*/
   int space[QUEUE_MAX]; /\* 队列空间 \*/
}RINGQ;

/\* 
 第一种设计方法:
 当head == tail 时,tag = 0 为空,等于 = 1 为满。
\*/

extern int ringq\_init(RINGQ \* p_queue);

extern int ringq\_free(RINGQ \* p_queue);


/\* 加入数据到队列 \*/
extern int ringq\_push(RINGQ \* p_queue,int data);

/\* 从队列取数据 \*/
extern int ringq\_poll(RINGQ \* p_queue,int \*p_data);


#define ringq\_is\_empty(q) ( (q->head == q->tail) && (q->tag == 0))

#define ringq\_is\_full(q) ( (q->head == q->tail) && (q->tag == 1))

#define print\_ringq(q) printf("ring head %d,tail %d,tag %d\n", q->head,q->tail,q->tag);
#ifdef \_\_cplusplus
}
#endif 

#endif /\* \_\_RINGQ\_H\_\_ \*/

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
#include <stdio.h>
#include "ringq.h"

int ringq\_init(RINGQ \* p_queue)
{
   p_queue->size = QUEUE_MAX ;

   p_queue->head = 0;
   p_queue->tail = 0;

   p_queue->tag = 0;

   return 0;
}

int ringq\_free(RINGQ \* p_queue)
{
  return 0;
}


int ringq\_push(RINGQ \* p_queue,int data)
{
  print\_ringq(p_queue);

  if(ringq\_is\_full(p_queue))
   {

     printf("ringq is full\n");
     return -1;
   }

   p_queue->space[p_queue->tail] = data;

   p_queue->tail = (p_queue->tail + 1) % p_queue->size ;

   /\* 这个时候一定队列满了\*/
   if(p_queue->tail == p_queue->head)
    {
       p_queue->tag = 1;
    }



![img](https://img-blog.csdnimg.cn/img_convert/3c0cf433b8f140385b3988508cad4d91.png)
![img](https://img-blog.csdnimg.cn/img_convert/b0ed3a372c6e03de5779ae11391a5bad.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/908202
推荐阅读
相关标签
  

闽ICP备14008679号