数据结构—环形缓冲区

写在前面,2023年11月开始进入岗位,工作岗位是嵌入式软件工程师。2024年是上班的第一年的,希望今年收获满满,增长见闻。

数据结构—环形缓冲区

为什么要使用环形数组,环形数组比起原来的常规数组的优势是什么?

环形数组(Circular Array)是一种特殊类型的数组,其元素在内存中首尾相接,形成一个环形。环形数组具有一些独特的优势和用途,使其在某些应用场景中比常规数组更为适用。以下是一些使用环形数组的原因和优势:

空间利用率高:由于环形数组的元素在内存中是首尾相接的,因此不需要为数组的头部和尾部留出额外的空间。这使得环形数组的空间利用率比常规数组更高。

高效的数据访问:在环形数组中,可以通过简单的模运算来确定一个元素在数组中的位置。这使得数据访问操作更加高效。

连续的数据结构:环形数组保持了数据的连续性,这有助于提高数据访问的局部性,从而优化CPU缓存的性能。

避免数组越界问题:由于环形数组的特性,当索引超出数组的界限时,会自动回到数组的开头或结尾,避免了常规数组越界访问导致的错误。

循环队列和缓冲区实现:环形数组可以方便地实现循环队列或缓冲区,无需移动大量数据即可进行队首和队尾的添加与删除操作。

减少内存碎片:由于环形数组的连续存储特性,它可以更有效地利用内存空间,减少内存碎片的产生。
易于实现动态扩展:当需要增加更多元素时,环形数组可以通过简单地扩展现有数组的大小来实现动态扩展,而无需重新分配和复制原有数据。

c代码实现

#include <stdio.h>  
#include <stdlib.h>  
#include <stdbool.h>  #define BUFFER_SIZE 5 // 定义环形缓冲区的大小  typedef struct {  int buffer[BUFFER_SIZE]; // 缓冲区数组  int head; // 指向缓冲区中第一个元素的位置  int tail; // 指向缓冲区中下一个要写入元素的位置  
} CircularBuffer;  // 初始化环形缓冲区  
void init_circular_buffer(CircularBuffer *cb) {  cb->head = 0;  cb->tail = 0;  for (int i = 0; i < BUFFER_SIZE; i++) {  cb->buffer[i] = 0; // 可以选择性地初始化缓冲区的内容  }  
}  // 检查环形缓冲区是否为空  
bool is_circular_buffer_empty(CircularBuffer *cb) {  return cb->head == cb->tail && cb->buffer[cb->head] == 0; // 如果头和尾相等且头部元素为空,则认为缓冲区为空  
}  // 检查环形缓冲区是否已满  
bool is_circular_buffer_full(CircularBuffer *cb) {  return (cb->tail + 1) % BUFFER_SIZE == cb->head; // 如果下一个要写入的位置是头部,则认为缓冲区已满  
}  // 向环形缓冲区中插入一个元素  
bool insert_into_circular_buffer(CircularBuffer *cb, int value) {  if (is_circular_buffer_full(cb)) {  return false; // 缓冲区已满,无法插入新元素  }  cb->buffer[cb->tail] = value; // 在尾部插入新元素  cb->tail = (cb->tail + 1) % BUFFER_SIZE; // 更新尾部指针到下一个位置  return true; // 插入成功  
}  // 从环形缓冲区中移除一个元素并返回它  
int remove_from_circular_buffer(CircularBuffer *cb) {  if (is_circular_buffer_empty(cb)) {  return -1; // 缓冲区为空,无法移除元素,返回错误代码或特殊值  }  int value = cb->buffer[cb->head]; // 获取头部元素的值  cb->buffer[cb->head] = 0; // 可选:将移除的元素置零(根据具体需求决定是否需要这一步)  cb->head = (cb->head + 1) % BUFFER_SIZE; // 更新头部指针到下一个位置  return value; // 返回被移除的元素值  
}  int main() {  CircularBuffer cb; // 声明一个环形缓冲区变量  init_circular_buffer(&cb); // 初始化环形缓冲区  // 向缓冲区中插入一些元素并检查其状态  for (int i = 1; i <= 6; i++) { // 尝试插入6个元素,但缓冲区大小只有5,所以会有一个插入失败  if (!insert_into_circular_buffer(&cb, i)) {  printf("Failed to insert element %d because the buffer is full.\n", i);  }  }  // 从缓冲区中移除一些元素并打印它们的值  for (int i = 0; i < 6; i++) { // 尝试移除6个元素,但只插入了5个,所以会有一个移除返回特殊值(这里是-1)  int value = remove_from_circular_buffer(&cb);  if (value == -1) {  printf("Failed to remove element because the buffer is empty.\n");  } else {  printf("Removed element: %d\n", value);  }  }  return 0;  
}

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/595299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql的读写分离

MySQL 读写分离原理 读写分离就是只在主服务器上写&#xff0c;只在从服务器上读。 主数据库处理事务性操作&#xff0c;而从数据库处理 select 查询。 数据库复制被用来把主数据库上事务性操作导致的变更同步到集群中的从数据库。 常见的mysql读写分离分为以下两种 1&…

CMake入门教程【核心篇】添加库(add_library)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1. 基本用法2.STATIC…

印刷企业如何快速上线MES管理系统解决方案

随着科技的不断发展&#xff0c;印刷行业正面临着前所未有的挑战与机遇。为了提高生产效率、降低成本、提升企业竞争力&#xff0c;许多印刷企业开始引入MES管理系统解决方案。然而&#xff0c;对于很多企业来说&#xff0c;如何快速、有效地上线MES管理系统却是一个难题。本文…

从门店客流看全国消费趋势,6张图展现元旦假期客流增长趋势

在刚刚过去的2024年元旦小长假&#xff0c;全国各地迎来了新年的第一波消费热潮。悠络客平台数据显示&#xff0c;2024元旦期间&#xff0c;零售、餐饮、教育等行业门店日均客流均呈现大幅上涨趋势&#xff0c;迎来了客流高峰。 这也是全国消费复苏的缩影&#xff0c;从门店客流…

C++/CLI——3继承与值类型、操作符重载与异常

C/CLI——3继承与值类型、操作符重载与异常 继承 C/cli中的继承用法基本和C#中的用法相同&#xff0c;只不过要注意以下几点&#xff1a; 标准的C在继承符号:之后&#xff0c;基类名称之前添加关键字public/protected/private&#xff0c;但是C/CLI只支持public&#xff0c;…

阿里云服务器地域怎么选择?哪个地域好?

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

基于决策树、随机森林和层次聚类对帕尔默企鹅数据分析

作者&#xff1a;i阿极 作者简介&#xff1a;数据分析领域优质创作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&#x1f4d2;关注哦&#x…

大数据应用安全策略包括什么

大数据应用安全策略是为了保障大数据应用中的数据安全而采取的一系列措施&#xff0c;其重要性不容小觑。以下是大数据应用安全策略所包含的主要内容&#xff1a; 一、数据加密与安全存储 数据加密&#xff1a;对于敏感数据&#xff0c;应采用加密技术进行保护&#xff0c;包括…

普中STM32-PZ6806L开发板(资料收集...)

简介 逐渐收集一些开发过程中使用到的文档资料数据手册 DS18B20 数据手册 DS18B20 Datasheet 开发文档 STM32F1各种文档 https://www.st.com/en/embedded-software/stm32cubef1.html#documentation HAL库文档开发文档 你使用的HAL文档, 在STM32CubeMX生成过程的最下面有…

『开发工具篇』- 配置 gradle 等相关依赖镜像源

『开发工具篇』- 配置 gradle 等相关依赖镜像源 1.更换gradle下载源2. 配置setting.gradlekts文件gradle文件 1.更换gradle下载源 使用腾讯云的镜像库https://mirrors.cloud.tencent.com/gradle/ gradle-x.x-all.zip&#xff1a;编译后的二进制发布版以及源码和文档gradle-x.…

chrome面向服务的架构SOA

chrome 浏览器面向服务的架构 原来的各种模块会被重构成独立的服务&#xff0c;每个服务都可以独在独立的进程中运行&#xff0c;可以在浏览器的任务管理器中看到各种服务。 "面向服务的架构"&#xff08;Service-Oriented Architecture&#xff0c;SOA&#xff09;…

Kubernetes Gateway API V1.0:您应该切换吗?

自Kubernetes Gateway API 发布 v1.0以来已经过去两个多月了&#xff0c;这标志着其一些关键 API 已经进入普遍可用状态。 去年&#xff0c;当网关 API升级为测试版时&#xff0c;我曾写过有关该 API的文章&#xff0c;但一年后&#xff0c;问题仍然存在。您是否应该从 Ingres…

自由DIY预约小程序源码系统:适用于任何行业+自由DIY你的界面布局+全新升级的UI+多用户系统 带安装部署教程

随着移动互联网的普及&#xff0c;预约服务逐渐成为人们日常生活的一部分。从家政服务、医疗挂号到汽车保养&#xff0c;预约已经渗透到各个行业。然而&#xff0c;市面上的预约小程序大多功能单一&#xff0c;界面老旧&#xff0c;无法满足商家和用户的个性化需求。今天来给大…

整合【事务】

目录 1、读未提交&#xff08;脏读&#xff09; 2、读已提交&#xff08;不可重复读&#xff09; 3、可重复读&#xff08;幻读&#xff09; 4、Navicat中模拟开启、提交、回滚事务 1、读未提交&#xff08;脏读&#xff09; 允许一个事务读取其他事务未提交的修改 2、读已…

异步优势演员-评论家算法 A3C

异步优势演员-评论家算法 A3C 异步优势演员-评论家算法 A3C网络结构并行步骤 异步优势演员-评论家算法 A3C A3C 在 A2C 基础上&#xff0c;增加了并行训练&#xff08;异步&#xff09;来提高效率。 网络结构 A2C&#xff1a; A3C&#xff1a; 在这两张图之间&#xff0c;…

安装cnpm报4048错误

记一次安装cnpm报错&#xff1a; 默认安装的是最新版本的cnpm&#xff0c;可能跟现有的npm不匹配。指定一个低版本的cnpm&#xff0c;或者升级npm到最新版本。 #指定一个cnpm的版本&#xff0c;这里是7.1.1 npm install -g cnpm7.1.1 --registryhttps://registry.npm.taobao…

【C程序设计】C循环

有的时候&#xff0c;我们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了更为复杂执行路径的多种控制结构。 循环语句允许我们多次执行一个…

【C语言进阶篇】关于指针的八个经典笔试题(图文详解)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; 指针笔试题&#x1f4ad; 笔试题 1&#xff1a;✅ 代码解析⁉️ 检验结果&…

听GPT 讲Rust源代码--compiler(5)

File: rust/compiler/rustc_resolve/src/rustdoc.rs rust/compiler/rustc_resolve/src/rustdoc.rs是Rust编译器中解析文档注释的模块。该模块处理Rust源代码中的文档注释&#xff0c;提取出有用的信息&#xff0c;例如函数、结构体、枚举的名称、说明、参数、返回值等。它的主要…

羊大师讲解喝羊奶的好处多,降低脂肪风险还有不少!

羊大师讲解喝羊奶的好处多&#xff0c;降低脂肪风险还有不少&#xff01; 喝羊奶是一种非常健康的饮品&#xff0c;具有许多好处。相比于牛奶&#xff0c;羊奶含有更多的维生素和矿物质&#xff0c;对身体更有益。喝羊奶可以减少脂肪摄入&#xff0c;有助于降低患心血管疾病的…