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

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://xiahunao.cn/news/2868798.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

EtherCAT 开源主站 IGH 在 linux 开发板的移植和伺服通信测试

手边有一套正点原子linux开发板imax6ul&#xff0c;一直在吃灰&#xff0c;周末业余时间无聊&#xff0c;把EtherCAT的开源IGH主站移植到开发板上玩玩儿&#xff0c;搞点事情做。顺便学习研究下EtherCAT总线协议及其对伺服驱动器的运动控制过程。实验很有意思&#xff0c;这里总…

2核4G云服务器并发能支持多少用户在线?

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;并发数为10&#xff0c;经阿腾云测试&a…

学点Java打小工_Day4_数组_冒泡排序

1 数组基本概念 程序算法数据结构 算法&#xff1a;解决程序的流程步骤 数据结构&#xff1a;将数据按照某种特定的结构来存储 设计良好的数据结构会导致良好的算法。 ArrayList、LinkedList 数组是最简单的数据结构。 数组&#xff1a;存放同一种类型数据的集合&#xff0c;在…

桌面待办,电脑桌面怎么设置待办事项

在忙碌的工作生活中&#xff0c;我们经常会有许多事情需要处理&#xff0c;为了提高工作效率和管理时间&#xff0c;很多人都有一套自己的桌面待办事项管理方法。那么&#xff0c;如何利用电脑桌面待办事项来提高工作效率&#xff0c;电脑桌面怎么设置待办事项呢&#xff1f; …

【Poi-tl Documentation】自定义占位符来设置图片大小

前置说明&#xff1a; <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version> </dependency>模板文件&#xff1a; image_test.docx package run.siyuan.poi.tl.policy;imp…

Internet协议的安全性

Internet协议的安全性 文章目录 Internet协议的安全性1. 网络层1. IP*62. ARP*33. ICMP * 3 2. 传输层协议1. TCP1. * SYN-Flood攻击攻击检测* 防御 2. TCP序号攻击攻击 3. 拥塞机制攻击 2. UDP 3. 应用层协议1. DNS攻击*3防范*3: 2. FTP3. TELNET: 改用ssh4. 电子邮件1. 攻击2…

set与zset数据类型

set类型基础 redis集合(set)类型和list列表类型类似&#xff0c;都可以用来存储多个字符串元素的 集合。但是和list不同的是set集合当中不允许重复的元素。而且set集合当中元素是没有顺序的&#xff0c;不存在元素下标。 redis的set类型是使用哈希表构造的&#xff0c;因此复…

每日OJ题_简单多问题dp⑥_力扣714. 买卖股票的最佳时机含手续费

目录 力扣714. 买卖股票的最佳时机含手续费 状态机分析 解析代码 力扣714. 买卖股票的最佳时机含手续费 714. 买卖股票的最佳时机含手续费 难度 中等 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续…

Linux远程连接本地数据库(docker)

1. 安装docker 参考上一篇文章 CentOS安装Docker 2. Linux中安装Mysql 2.1 docker拉取mysql镜像 拉取镜像 docker pull mysql查看镜像列表 docker images2.2 运行mysql容器 运行一个名字为mysql的mysql容器&#xff0c;其连接端口号为3306&#xff0c;密码为123456 docker r…

口腔管理平台 |基于springboot框架+ Mysql+Java+B/S结构的口腔管理平台 设计与实现(可运行源码+数据库+lw文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 会员功能 系统功能设计 数据库E-R图设计 lunwen参考…

RT-Thread之USB组件的使用记录(SD卡和USB同时挂载)

前言 使用usb-host组件读取u盘记录同时挂载sd和u盘用到的芯片为stm32f407zgt6u盘的格式为fat 组件选择 文件相关的宏定义 /* DFS: device virtual file system */ /* 设备虚拟文件系统 */ #define RT_USING_DFS #define DFS_USING_WORKDIR #define DFS_FILESYSTEMS_MAX 3 //…

Pikachu 靶场搭建

文章目录 环境说明1 Pikachu 简介2 Pikachu 安装 环境说明 操作系统&#xff1a;Windows 10PHPStudy 版本: 8.1.1.3Apache 版本&#xff1a;2.4.39MySQL 版本 5.7.26 1 Pikachu 简介 Pikachu是一个使用“PHP MySQL” 开发、包含常见的Web安全漏洞、适合Web渗透测试学习人员练…

印度交易所股票行情数据API接口

1. 历史日线 # Restful API https://tsanghi.com/api/fin/stock/XNSE/daily?token{token}&ticker{ticker}默认返回全部历史数据&#xff0c;也可以使用参数start_date和end_date选择特定时间段。 更新时间&#xff1a;收盘后3~4小时。 更新周期&#xff1a;每天。 请求方式…

python二级备考(3)-综合应用

1 《命运》是著名科幻作家倪匡的作品。这里给出《命运》的一个网络版本文件&#xff0c;文件名为“命运. txt”。 问题1 (5分) :在PY301-1. py文件中修改代码&#xff0c;对“命运. txt”文件进行字符频次统计&#xff0c;输出频次最高的中文字符(不包含标点符号)及其频次&…

初学者必看的python中类型转换

Python中常见的类型转换 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个浮点数 complex(real [,imag ]) 创建一个复数 str(x ) 将对象 x 转换为字符串 repr(x ) 将对象 x 转换为表达式字符串 eval(str ) 用来计算在字符串中…

05-延迟任务精准发布文章-黑马头条

延迟任务精准发布文章 1)文章定时发布 2)延迟任务概述 2.1)什么是延迟任务 定时任务&#xff1a;有固定周期的&#xff0c;有明确的触发时间延迟队列&#xff1a;没有固定的开始时间&#xff0c;它常常是由一个事件触发的&#xff0c;而在这个事件触发之后的一段时间内触发…

Docker----Dockerfile构建微服务镜像

目录 一、关键步骤 二、具体步骤 1、准备后端jar包(这里以java后端演示) 2、编写Dockerfile 3、构建镜像 4、运行镜像容器 5、测试是否成功 一、关键步骤 1、准备后端jar包(这里以java后端演示) 2、编写Dockerfile 3、构建镜像 4、运行镜像容器 5、测试是否成功 二…

软件工程(Software Engineering)

一、软件工程概述 1.软件生存周期 软件&#xff1a; 包含程序、数据及相关文档 软件工程&#xff1a; 涉及到软件开发、维护、管理等多方面的原理、工具与环境。最终的目的是开发高质量的软件。 目的&#xff1a; 提高软件生产率、提高软件质量、降低软件成本。 文档的作用&…

2024 Mazing 3 中文版新功能介绍Windows and macOS

iMazing 3中文版(ios设备管理软件)是一款管理苹果设备的软件&#xff0c; Windows 平台上的一款帮助用户管理 IOS 手机的应用程序。iMazing中文版与苹果设备连接后&#xff0c;可以轻松传输文件&#xff0c;浏览保存信息等&#xff0c;软件功能非常强大&#xff0c;界面简洁明晰…

力扣965单值二叉树的小细节

这一段的两个判断条件&#xff0c;一定要root->left!NULL在前 如果root->val!root->left->val在前&#xff0c;root->left为空的时候&#xff0c;就无法拿出root->left->val&#xff0c;在一个NULL的指针里拿不出val。 把root->left!NULL放在前面&am…