数据结构:基于数组实现简单的数据缓存区(简单队列)

1 前言

在我们使用CAN或者以太网调试时,经常需要缓存最近n次收到的数据,以便于我们对数据进行分析。
实现这一想法我们很容易就会想到队列,队列就是一种先进先出的数据结构,之前在《数据结构:基于数组的环形队列(循环队列)实现》介绍了基于数组的环形队列(循环队列)的实现,使用到了头尾2个指针,根据头尾指针的关系其实我们可以只使用尾指针就实现循环队列。
下面介绍一种只使用尾指针实现简单的数据缓存区(简单队列)的方法。

2 简单队列实现

2.1 简单队列的定义

#define MAX_DATA_NO 10   // 数据存储量
#define MAX_DATA_BUFF 10 // 数据缓存区大小
typedef struct
{int fullFlg;                              /* 队列满标志 0-未满 1-满*/int dataTail;                             /* 队列尾指针 */int dataTotalCount;                       /* 总共数据量 */int dataLen[MAX_DATA_NO];                 /* 数据长度 */int dataBuff[MAX_DATA_NO][MAX_DATA_BUFF]; /* 数据缓存区 */
} s_queue_t;

2.2 初始化简单队列

/*** @brief 初始化简单队列** @param sQueue 简单队列地址*/
void init_squeue(s_queue_t *sQueue)
{sQueue->fullFlg = 0;sQueue->dataTail = 0;sQueue->dataTotalCount = 0;
}

初始化简单队列的操作很简单,就是将尾指针、队列满标志、接收数据计数全部清零。

2.3 添加数据到队列

/*** @brief 添加数据到简单队列** @param sQueue 简单队列地址* @param dataLen 数据长度* @param dataBuff 数据缓存区*/
void add_data_to_squeue(s_queue_t *sQueue, int dataLen, int *dataBuff)
{int i;sQueue->dataLen[sQueue->dataTail] = dataLen;for (i = 0; i < dataLen; i++){sQueue->dataBuff[sQueue->dataTail][i] = dataBuff[i];}sQueue->dataTail++;if (sQueue->dataTail >= MAX_DATA_NO){sQueue->dataTail = 0;}sQueue->dataTotalCount++;if (sQueue->dataTotalCount >= MAX_DATA_NO){sQueue->fullFlg = 1;}
}

添加数据到队列就是将数据、数据长度写到尾指针指向的数据缓存区,然后将尾指针后移一位(超出缓存区容量时跳转到0)。

2.4 简单队列数据打印

/*** @brief 打印简单队列数据** @param dataHead 数据头* @param dataNum 数据数量* @param sQueue 简单队列地址*/
void printf_squeue_data(int dataHead, int dataNum, s_queue_t *sQueue)
{int p;int i, j, k = 0;printf("Num   Len  Data\r\n");for (i = 0; i < dataNum; i++){p = dataHead + i;if (p >= MAX_DATA_NO){p -= MAX_DATA_NO;}printf("%-3d   %-2d   ", ++k, sQueue->dataLen[p]);for (j = 0; j < sQueue->dataLen[p]; j++){printf("%d ", sQueue->dataBuff[p][j]);}printf("\r\n");}
}
/*** @brief 简单队列数据处理** @param sQueue 队列地址*/
void squeue_data_pro(s_queue_t *sQueue)
{int i, j;int dataHead, dataTail;printf("Total data count : %d\r\n", sQueue->dataTotalCount);if (sQueue->fullFlg != 1){printf_squeue_data(0, sQueue->dataTotalCount, sQueue);}else{dataHead = sQueue->dataTail;printf_squeue_data(dataHead, MAX_DATA_NO, sQueue);}
}

简单队列数据打印分为2个部分:
(1)数据解析部分
根据简单队列句柄的队列满标志求得队列头指针值、数据数量。
(2)数据打印部分
根据传入的队列头和数据数量打印队列数据信息。

3 测试

3.1 添加7个数据(队列未满情况)

测试程序如下:

int main(void)
{int i;int data[10] = {0, 11, 12, 13, 14, 15, 16, 17, 18, 19};s_queue_t sQueue;init_squeue(&sQueue);for (i = 0; i < 7; i++){data[0]++;add_data_to_squeue(&sQueue, 10, data);}squeue_data_pro(&sQueue);return 0;
}

向简单队列添加7个数据,首个数据从1-7。打印结果如下:
在这里插入图片描述
测试正常。

3.2 添加700个数据(队列满情况)

测试程序如下:

int main(void)
{int i;int data[10] = {0, 11, 12, 13, 14, 15, 16, 17, 18, 19};s_queue_t sQueue;init_squeue(&sQueue);for (i = 0; i < 700; i++){data[0]++;add_data_to_squeue(&sQueue, 10, data);}squeue_data_pro(&sQueue);return 0;
}

向简单队列添加700个数据,首个数据从1-700。打印结果如下:
在这里插入图片描述
测试正常。

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

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

相关文章

最新最全智能科学与技术专业毕业设计选题精华汇总-持续更新中

文章目录 0 简介1 如何选题2 最新智能科学与技术毕设选题3 最后 0 简介 Hi&#xff0c;大家好&#xff0c;随着毕业季的临近&#xff0c;许多同学开始向学长咨询关于选题和开题的问题。在这里&#xff0c;学长分享一些关于智能科学与技术专业毕业设计选题的内容。 以下为学长…

人大金仓大小写敏感处理

人大金仓安装的时候&#xff0c;不管是否选择大小写敏感&#xff1b;查询的时候加和不加双引号&#xff0c;查询出来的都是小写 针对人大金仓大小写&#xff0c;我们实际引用全是大写的情况&#xff0c;解决方案如下 添加配置&#xff0c;将查询结果全都转成大写 1、本地打开…

基于信号分解的几种一维时间序列降噪方法(MATLAB R2021B)

自适应信号分解算法是一种适合对非平稳信号分析的方法&#xff0c;它将一个信号分解为多个模态叠加的形式&#xff0c;进而可以准确反应信号中所包含的频率分量以及瞬时频率随时间变化的规律。自适应信号分解算法与众多“刚性”方法(如傅里叶变换&#xff0c;小波变换)不同&…

SpringBoot3整合mybatis

SpringBoot3整合mybatis 一、添加mybatis的依赖二、通过XML配置三、通过yum或properties文件配置四、常用注解1.Mapper2.MapperScan 一、添加mybatis的依赖 <!--mybatis--> <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>…

简单的网页制作

1网页编写格式 <!DOCTYPE html> <html><head><meta charset"utf-8"> <title>中文测试。。。。</title></head><body>这里是测试body测试内容。。。</body> </html>2标签 在body内<h1></h1&…

鸿蒙开发实现弹幕功能

鸿蒙开发实现弹幕功能如下&#xff1a; 弹幕轮播组件&#xff1a;BannerScroll import type { IDanMuInfoList, IDanMuInfoItem } from ../model/DanMuData //定义组件 Component export default struct BannerScroll {//Watch 用来监视状态数据的变化&#xff0c;包括&#…

Java代码基础算法练习-判断字符串是否为回文-2024.03.16

任务描述&#xff1a; 回文串是指一个正读和反读都一样的字符串&#xff0c;比如“level”或者“noon”等。要求输入 一个字符串&#xff0c;判断此字符串是否为回文。&#xff08;注&#xff1a;设字符串长度小于20&#xff09; 任务要求&#xff1a; package suanfa;import…

Vue:内置组件:KeepAlive(缓存组件实例)

一、作用 <KeepAlive></KeepAlive>能缓存包裹的所有组件&#xff0c;保证组件在切换时维持组件状态。 默认情况下&#xff0c;一个组件实例在被替换掉后会被销毁。这会导致它丢失其中所有已变化的状态——当这个组件再一次被显示时&#xff0c;会创建一个只带有初…

部署一个本地的ChatGPT(Ollama)

一 下载Ollama Ollama下载地址&#xff1a;https://ollama.com/download 下载完后 二 安装运行 双击下载好的OllamaSetup.exe开发 安装Ollama: 安装完成后&#xff0c;多了一个Ollama的菜单如下图 &#xff1a; Ollama安装好默认是配置开机运行&#xff0c;如果没有运行可以在…

MyBatis plus自动生成代码

1.pom文件配置 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3</version> </dependency> <dependency><groupId>com.baomidou</groupId>…

第五十九回 公孙胜芒砀山降魔 晁天王曾头市中箭-飞桨自然语言处理套件PaddleNLP初探

公孙胜献出八卦阵&#xff0c;宋江用八员大将守阵。项充李衮进入阵里&#xff0c;被抓住了。宋江说久闻大名&#xff0c;来梁山吧。两人说誓当效力到死&#xff0c;希望能先放我们两个回去把樊瑞带来一起。见到樊瑞后把宋江讲义气一说&#xff0c;樊瑞说不可逆天&#xff0c;于…

力扣112、113、101--树

112. 路径总和 题目描述&#xff1a; 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。 判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。 如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c…

轻松搞定找不到vcomp140.dll无法继续执行程序的5种方法

在我们日常使用计算机的过程中&#xff0c;频繁且不可避免地会遭遇到各种类型的错误提示信息&#xff0c;这些错误信息往往会在关键时刻阻碍我们的操作进程。其中&#xff0c;有一个颇为常见的错误提示值得我们关注&#xff0c;那就是“vcomp140.dll丢失”。这个错误提示涉及到…

【计算机视觉】二、图像形成——实验:2D变换编辑(Pygame)

文章目录 一、向量和矩阵的基本运算二、几何基元和变换1、几何基元(Geometric Primitives)2、几何变换(Geometric Transformations)2D变换编辑器0. 程序简介环境说明程序流程 1. 各种变换平移变换旋转变换等比缩放变换缩放变换镜像变换剪切变换 2. 按钮按钮类创建按钮 3. Pygam…

更安全的C gets()和str* 以及fgets和strcspn的用法

#include <stdio.h>int main() {char *str;gets(str);puts(str);return(0); }可以说全是错误 首先char *str没有指向一个分配好的地址&#xff0c;就直接读入&#xff0c;危险 ps: 怎么理解char *str "Hello World" 是将一个存储在一个只读的数据段中字符串常…

AI预测-一文解析AI预测数据工程

AI预测相关目录 AI预测流程&#xff0c;包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

《操作系统实践-基于Linux应用与内核编程》第10章-Linux综合应用

前言: 内容参考《操作系统实践-基于Linux应用与内核编程》一书的示例代码和教材内容&#xff0c;所做的读书笔记。本文记录再这里按照书中示例做一遍代码编程实践加深对操作系统的理解。 引用: 《操作系统实践-基于Linux应用与内核编程》 作者&#xff1a;房胜、李旭健、黄…

复现文件上传漏洞

一、搭建upload-labs环境 将下载好的upload-labs的压缩包&#xff0c;将此压缩包解压到WWW中&#xff0c;并将名称修改为upload&#xff0c;同时也要在upload文件中建立一个upload的文件。 然后在浏览器网址栏输入&#xff1a;127.0.0.1/upload进入靶场。 第一关 选择上传文件…

数字孪生-使用Unity构建能实时显示应力应变的孪生模型

Motivation - 采用Unity作为孪生技术栈的经历? 最开始想要利用Ansys的Twin Builder模块来进行数字孪生的开发&#xff0c;但是Ansys 的Twin Builder在部署的时候&#xff0c;需要license&#xff0c;要获得license所要花费的价格是难以接受的。 后来想要利用QTVTK的方式来进行…

MATLAB:拟合与插值

一、关于多项式的基本操作 若要求非线性方程的根&#xff0c;则采用fzero, fminbnd函数 二、多项式拟合 clc, clear x0:0.2:10; y0.25*x20*sin(x); plot(x,y,k.,MarkerSize,15) grid on; hold on [p1,s1,mu1]polyfit(x,y,3); %3阶多项式拟合 y1polyval(p1,x,s1,mu1); [p2,s…