2024年C C++最全【C C++开源库】环形队列,消息队列库_开源 queue 库,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;

初始化状态:

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

队列为空:

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

队列为满 :

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

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

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

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

下一个可读的位置在:

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

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\_\_ \*/

#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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在C语言中,标准中并没有内置的队列(queue。如果您使用了第三方队列,那么具体的查看队列长度函数会依赖于您使用的。 下面是一些常见的第三方队列及其查看队列长度的函数: 1. C++ STL中的队列(queue:如果您在C++中使用STL的队列,可以通过 `size()` 函数查看队列中元素的个数,例如: ``` #include <queue> using namespace std; queue<int> q; int len = q.size(); // 获取队列长度 ``` 2. C 语言中的 `queue.h` :如果您使用的是C 语言中的 `queue.h` ,可以通过 `queue_size()` 函数查看队列中元素的个数,例如: ``` #include <stdio.h> #include <stdlib.h> #include <queue.h> int main() { QUEUE *q = que_init(); que_push(q, 1); que_push(q, 2); que_push(q, 3); int len = queue_size(q); // 获取队列长度 printf("Queue size: %d\n", len); que_free(q); return 0; } ``` 请注意,以上示例代码仅供参考,具体实现可能会因的版本或个人编写方式而有所不同。 ### 回答2: C语言中的queue并不是标准的一部分,它是一个由用户自己实现的队列。因此,并没有一个固定的函数来查看队列的长度。 用户可以通过在队列结构体中添加一个表示队列当前长度的变量来实现此功能。在进行入队操作时,该变量加1;在出队操作时,该变量减1。这样,通过直接访问该变量即可得到队列的当前长度。 下面是一个示例代码: ``` #include <stdio.h> #define MAX_SIZE 100 // 定义队列的最大容量 typedef struct { int data[MAX_SIZE]; // 用数组来存储队列元素 int front; // 队首指针 int rear; // 队尾指针 int length; // 队列长度 } Queue; // 初始化队列 void initQueue(Queue *queue) { queue->front = 0; queue->rear = -1; queue->length = 0; } // 入队操作 void enqueue(Queue *queue, int element) { if (queue->length == MAX_SIZE) { printf("Queue is full!\n"); return; } queue->rear = (queue->rear + 1) % MAX_SIZE; queue->data[queue->rear] = element; queue->length++; } // 出队操作 int dequeue(Queue *queue) { if (queue->length == 0) { printf("Queue is empty!\n"); return -1; } int element = queue->data[queue->front]; queue->front = (queue->front + 1) % MAX_SIZE; queue->length--; return element; } // 查看队列长度 int getQueueLength(Queue *queue) { return queue->length; } int main() { Queue queue; initQueue(&queue); enqueue(&queue, 1); enqueue(&queue, 2); enqueue(&queue, 3); printf("Queue length: %d\n", getQueueLength(&queue)); dequeue(&queue); printf("Queue length: %d\n", getQueueLength(&queue)); return 0; } ``` 以上代码实现了一个队列的基本操作,并通过`getQueueLength`函数获取队列的长度。 ### 回答3: c中queue的查看队列长度的函数是`size()`函数。 `size()`函数用于返回队列中的元素个数。调用方法如下: ``` #include <stdio.h> #include <stdbool.h> #include <stdlib.h> #include <queue.h> int main() { queue *q = queue_creare(); // 向队列中添加元素 queue_push(q, 1); queue_push(q, 2); queue_push(q, 3); // 查看队列的长度 int length = size(q); printf("队列长度为:%d\n", length); // 释放队列 queue_destroy(q); return 0; } ``` 在上述例子中,首先使用`queue_create()`函数创建了一个空队列`q`,然后使用`queue_push()`函数向队列中添加了三个元素,接着使用`size()`函数获取了队列的长度并存储在变量`length`中,最后使用`printf()`函数将队列长度输出到屏幕上。最后使用`queue_destroy()`函数释放了队列所占用的内存。 这样就可以通过`size()`函数获取队列的长度了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值