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

news2024/12/27 11:19:29

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.coloradmin.cn/o/1521944.html

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

相关文章

C#Socket通信实现

1.编写服务端代码&#xff0c;以原石兑换码为例&#xff08;分别建立两个控制台应用&#xff0c;一个用于服务端&#xff0c;一个用于客户端&#xff09; using System.Net.Sockets; using System.Net; using System.Text;namespace 网络游戏服务器 {internal class Program{s…

机器学习是什么?

机器学习是一种人工智能&#xff08;AI&#xff09;的分支&#xff0c;其主要目标是使计算机系统能够通过数据和经验来改进和学习&#xff0c;而无需明确地编程。在机器学习中&#xff0c;计算机系统会通过对大量数据进行学习和分析&#xff0c;从中发现模式和规律&#xff0c;…

LeetCode每日一题——移除元素

移除元素OJ链接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; 题目给定要求只能使用O(1)的额外空间并且原地修改输入数组&#xff0c;然后返回移除后的数组行长度。那 么我们就可以确我没有办法建立临时的数组存放我…

总要做一回书里的国风少女吧,女儿的新中式套装美出新高度了~

超有质感的新中式国风短袖 采用经典立领设计 活里内衬柔软舒适 搭配浅色系马面裙 如书中温婉气质的千金小姐~

20240304 json可以包含复杂数组(数组里面套数组)

欣赏一下我的思维&#xff0c;它会以漫画&#xff0c;表格&#xff0c;文字。。。各种各样的形式呈现 对于问题1问题2 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。JSON本质上是一种文本…

【MASM汇编语言快速入门】8086MASM汇编深入理解指令对标志位的影响

8086MASM汇编深入理解指令对标志位的影响 文章目录 8086MASM汇编深入理解指令对标志位的影响0. 指令对标志位影响1. 指令对标志位影响速查表2. flags标志寄存器: 标志位含义解读flags1. 状态标志cf, pf, af, zf, sf, of2. 控制标志df, if, tf 详解&#xff1a;1. 传送指令2. 算…

管理类联考–复试–政治--二十大--记忆宫殿

文章目录 整体记忆宫殿门床头柜床书桌阳台 口诀记忆法 整体 记忆宫殿 要有逻辑的放到房间了 何为逻辑&#xff0c;如下大佬总结的便是&#xff0c;或者可自行总结&#xff0c;有前后顺序&#xff0c;做事逻辑即可 第一步&#xff1a;将逻辑的点放到房间里的点&#xff0c;…

旅游管理系统 |基于springboot框架+ Mysql+Java+Tomcat的旅游管理系统设计与实现(可运行源码+数据库+设计文档)

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

LCD屏的应用

一、LCD屏应用 Linux下一切皆文件&#xff0c;我们的LCD屏再系统中也是一个文件&#xff0c;设备文件&#xff1a;/dev/fb0。 如果要在LCD屏显示数据&#xff0c;那我们就可以把数据写入LCD屏的设备文件。 1.显示颜色块 LCD屏分辨&#xff1a;800*480 像素 32位:说明一个像…

一文搞懂PCL中自定义点云类型的构建与函数使用

上周猛男快乐开发时遇到个bug&#xff0c;要用pcl的函数对自定义的点云进行处理。一起解决问题时遇到了很多问题&#xff0c;解决后整理出来分享给各位参考&#xff0c;以免踩一样的坑&#x1f60a;。文章中自定义的点我用PointT来表示&#xff0c;自定义点云一般指的是pcl::Po…

C++:类之六脉神剑——默认成员函数

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为 空类 。 空类中真的什么都…

linux最佳入门(笔记)

1、内核的主要功能 2、常用命令 3、通配符&#xff1a;这个在一些启动文件中很常见 4、输入/输出重定向 意思就是将结果输出到别的地方&#xff0c;例如&#xff1a;ls标准会输出文件&#xff0c;默认是输出到屏幕&#xff0c;但是用>dir后&#xff0c;是将结果输出到dir文…

复习 --- windows 上安装 git,使用相关命令

文章目录 很少使用windows的git工具&#xff0c;这次借助这个任务&#xff0c;记录下使用过程&#xff0c;其他的等有空在整理。 其中&#xff0c;还使用了浏览器的AI小助手&#xff0c;复习了git相关的命令&#xff1a;图片放最后

Python中字符串知识点汇总,以及map()函数的使用

1.字符串的定义 字符串&#xff1a;字符串就是一系列字符。在python中&#xff0c;用引号括起来的都是字符串&#xff0c;其中的引号可以是单引号&#xff0c;也可以是双引号。 2.使用方法修改字符串的大小写 ①将字符串的字母全部改为大写&#xff1a;upper()函数 实例&…

集合系列(四) -LinkedHashMap详解

一、摘要 在集合系列的第一章&#xff0c;咱们了解到&#xff0c;Map的实现类有HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properties等等。 本文主要从数据结构和算法层面&#xff0c;探讨LinkedHashMap的实现。 二、简介 LinkedHashMap可…

欧科云链:ETH Dencun升级倒计时,哪些数据需要重点关注?

2024年3月13日 21:55&#xff08;epoch 269,568&#xff09;&#xff0c;以太坊将完成坎昆-德内布升级 &#xff08;Dencun 升级&#xff09;&#xff0c;OKLink 专题数据页传送门 &#x1f449; oklink.com/eth/dencun-upgrade 此次升级的主要目标是提升 Layer 2 网络的可扩展…

排序链表的三种写法

题目链接&#xff1a;https://leetcode.cn/problems/sort-list/?envTypestudy-plan-v2&envIdtop-100-liked 第一种&#xff0c;插入排序&#xff0c;会超时 class Solution {public ListNode sortList(ListNode head) {//插入排序&#xff0c;用较为简单的方式解决ListNo…

实现MySQL分页查询的三种方式~

首先我们先来查看一下表中的所有数据&#xff1a; select * from user;如下所示&#xff0c;有5条&#xff1a; 第一种方法&#xff1a; 使用LIMIT和OFFSET关键字 -- 从第1条开始取3条记录&#xff08;第一页&#xff09; SELECT * FROM user LIMIT 3 OFFSET 0; 输出如下所…

RTP 控制协议 (RTCP) 反馈用于拥塞控制

摘要 有效的 RTP 拥塞控制算法&#xff0c;需要比标准 RTP 控制协议(RTCP)发送方报告(SR)和接收方报告(RR)数据包提供的关于数据包丢失、定时和显式拥塞通知 (ECN) 标记的更细粒度的反馈。 本文档描述了 RTCP 反馈消息&#xff0c;旨在使用 RTP 对交互式实时流量启用拥塞控制…

Hack The Box-Jab

目录 信息收集 nmap enum4linux 服务信息收集 Pidgin kerbrute hashcat 反弹shell & get user 提权 系统信息收集 端口转发 漏洞利用 get root 信息收集 nmap 端口探测┌──(root㉿ru)-[~/kali/hackthebox] └─# nmap -p- 10.10.11.4 --min-rate 10000 -oA…