队列(queue)环形缓冲区(ring buffer),环形队列(ring queue)

环形缓冲区(又称圆形队列)是一种高效的数据结构,常用于处理大量数据流。它通过固定大小的缓冲区和首尾指针管理数据,避免了频繁的内存分配与释放。在数据处理过程中,当元素出队后,新的元素可以直接覆盖旧的,提高了处理效率。环形缓冲区常见于操作系统、网络通信及嵌入式系统等领域,用于数据包缓存、日志记录等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是环形缓冲区?
如何在代码中实现环形缓冲区?
环形缓冲区适用于甚麽样的场合?

队列

#define QueueSize 40 // 队伍容量
 
typedef struct{
    DataType queue[QueueSize];// 用于保存类型为DataType队列元素的数组
    int front,rear;// 用于保存队头和队尾下标信息        
}SeqQueue;

队列——普通队列和环形队列
指针的初始值
环形队列(front,rear=0)
队列(front,rear=-1)
添加与取出元素
环形队列(先改变值,后操作数组)
队列(后改变值,先操作数组)

#include <stdio.h>
 
#define MAX_SIZE 10
 
int queue[MAX_SIZE];
 
int rear = -1;
int front = -1;
 
int InQueue(int value)
{
	if(rear >= MAX_SIZE-1)
		return 0;
	rear ++;
	queue[rear] = value;
	return 1;
}
 
int OutQueue(int *value)
{
	if(front == rear)
		return 0;
	front ++;
	*value = queue[front];
	return 1;
}
 
void main()
{
	int temp;
 
	while(1)
	{
		printf("1:存取;2:读取;=》:");
		scanf("%d",&temp);
		fflush(stdin);
		if(temp == 1)
		{
			printf("请输入要存入的值:");
			scanf("%d",&temp);
			fflush(stdin);
			if(InQueue(temp) == 1)
				printf("插入队列成功\n");
			else
				printf("队列已满\n");
		}else if(temp == 2)
		{
			if(OutQueue(&temp))
			{
				printf("读取队列的值为:%d\n",temp);
			}else
				printf("队列为空\n");
		}else
			break;
	}
}

https://blog.youkuaiyun.com/Beyondandzy/article/details/118710161?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164457286316780255215481%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164457286316780255215481&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-13-118710161.pc_search_result_cache&utm_term=%E9%98%9F%E5%88%97%E5%92%8C%E7%8E%AF%E5%BD%A2%E9%98%9F%E5%88%97&spm=1018.2226.3001.4187

环形缓存区:
环形缓冲器(ringr buffer),也称作圆形队列(circular queue),循环缓冲区(cyclic buffer),圆形缓冲区(circula buffer),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。

背景:

当有大量数据的时候,我们不能存储所有的数据,那么计算机处理数据的时候,只能先处理先来的,那么处理完后呢,就会把数据释放掉,再处理下一个。那么,已经处理的数据的内存就会被浪费掉。因为后来的数据只能往后排队,如过要将剩余的数据都往前移动一次,那么效率就会低下了,肯定不现实,所以,环形队列就出现了。

环形队列

目的:避免频繁的内存创建取消、分配。内存一直只用了一块。

队列有着先入先出的特性。但是对于队列如果删除队头以后剩下的空间将不会被释放,又由于队列只能由队尾插入这就导致被删除部分的空间被浪费。解决这个问题就是循环队列。循环队列顾名思义就是将队列串起来形成一个类似与环的结构

不同于一般常见的队列,环形队列首尾相连,通过移动指针来控制队列中内容的读写。

这样做有什么好处呢?
最大的好处是环形队列出队(读取)后,不需要对后续队列内容进行搬移,可以后续由入队(写入)覆盖。
下面来看下一种常见的实现方式, 通过读写指针计数来实现环形队列
https://blog.youkuaiyun.com/newbmiao/article/details/120052386?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164455834616780271510849%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164455834616780271510849&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-11-120052386.first_rank_v2_pc_rank_v29&utm_term=ring+buffer+%E5%92%8C%E9%98%9F%E5%88%97&spm=1018.2226.3001.4187

ring buffer 数据结构

struct _RingB  
{  
    SI32 r_cursor;  
    SI32 w_cursor;  
    SI32 tr_cursor;  
    SI32 tw_cursor;  
    SI32 length;  
    char data[0];  
};  

ring queue 数据结构

struct _RingQ  
{  
    SI32 r_cursor;  
    SI32 w_cursor;  
    SI32 length;  
    void* data[0];  
};  

https://blog.youkuaiyun.com/wabil/article/details/50386446?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%8E%AF%E5%BD%A2%E7%BC%93%E5%86%B2%E5%8C%BA%E5%92%8C%E7%8E%AF%E5%BD%A2%E9%98%9F%E5%88%97&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-50386446.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

图解RingBuffer数据结构

本篇介绍一种简单高效的数据缓存结构: RingBuffer, 这种结构实现起来只需要几行代码即可,但使用场景却很广泛,比如在Linux内核中网络数据包的缓存,系统日志的存储等多处使用过该结构。同时它也被广泛的应用于异步通信以及嵌入式设备中,提供高效的数据缓存读写操作。

https://blog.youkuaiyun.com/u014029783/article/details/107622792?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_paycolumn_v3&utm_relevant_index=2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学无止境2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值