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

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。打印结果如下:
在这里插入图片描述
测试正常。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

win10 + cpu + pycharm + mindspore

MindSpore是华为公司自研的最佳匹配昇腾AI处理器算力的全场景深度学习框架。 1、打开官网&#xff1a; MindSpore官网 2、选择以下选项&#xff1a; 3、创建conda 环境&#xff0c;这里python 选择3.9.0&#xff0c;也可以选择其他版本&#xff1a; conda create -c conda-…

xray问题排查,curl: (35) Encountered end of file(已解决)

经过了好几次排查&#xff0c;都没找到问题&#xff0c;先说问题的排查过程&#xff0c;多次确认了user信息&#xff0c;包括用户id和alterid&#xff0c;都没问题&#xff0c;头大的一逼 问题排查过程 确保本地的xray服务是正常的 [rootk8s-master01 xray]# systemctl stat…

【力扣白嫖日记】1934.确认率

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1934.确认率 表&#xff1a;Signups 列名类型user_idinttime_stampdatetime User_id是该表的主键。每一行都…

人工智能原理:探索智能的奥秘

人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。是新一轮科技革命和产业变革的重要驱动力量&#xff0c;是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 人工智能是智能学科重要的组成部分&a…

XXE漏洞原理和pikachu靶场实验

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、XXE漏洞原理 XXE全称&#xff1a;XML External Enti…

YOLOv9更换iou|包含CIoU、DIoU、MDPIoU、GIoU

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 更换YOLOv9中使用的Iou计算方式&#xff0c;目前支持CIoU、DIoU、MDPIoU、GIoU。 二、Iou模块详解 2.1 模块简介 Iou的主要思想&…

【Poi-tl Documentation】自定义行删除标签

前置说明&#xff1a; <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version> </dependency>模板样式&#xff1a; 删除行表格测试.docx 实现思路&#xff1a;通过定制占位…

ctfshow(WEB AK赛)

目录 web-观己 web1-观字 web2-观星 web3-观图 web4-观心 过程and分析 web-观己 没啥难的有include 想着伪协议 但是过滤了php 那就是用file为协议读取本地文件 全靠猜 <?php if(isset($_GET[file])){$file $_GET[file];if(preg_match(/php/i, $file)){die(error);}…

win下 VirtualBox 自动启动脚本脚本

文章目录 一、找到VBoxManage二、测试脚本1、打开cmd2、输入命令 (直接把上面找到的VBoxManage.exe 拖入到cmd中&#xff0c;这样就不用输入路径了)3、效果展示 比如虚拟机中的系统名称叫“centos-mini” 三、设置自动启动脚本1、复制刚才测试好的命令到新建文本中2、修改文本名…

SpringBoot整合Seata注册到Nacos服务

项目引入pom文件 <!-- SpringCloud Seata 组件--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-seata</artifactId><version>${alibaba.seata}</version><exclusions><exc…

Vintage账龄分析表计算底层逻辑(Python实操)

大家好&#xff0c;我是东哥。 信贷风控领域中&#xff0c;经常用到账龄Vintage报表&#xff0c;这是入门初学者的难点之一&#xff0c;因为它涉及到用户还款、逾期等多种行为以及业务上的多种统计口径&#xff0c;因此很多朋友一直无法将逻辑梳理清楚。本次来给大家详细介绍V…

计算机系统基础 2 Intel 中央处理器

Intel微处理器的发展史 INTegrated ELectronics&#xff08;集成电子&#xff09;的缩写 先后推出的中央处理器&#xff1a; Intel4004、Intel8008、Intel8080/8085、8086/8088、80186、80286、i386、i486 Pentium&#xff08;奔腾&#xff09;、Pentium II、Pentium III、Pen…

布局Uniswap(UNI)的基本逻辑和bitget钱包使用教程

我们都知道&#xff0c;牛市里板块轮动是很明显的&#xff0c;这个概念涨完下一个概念涨&#xff01; 背后本质是场内的筹码在交换的过程&#xff0c;抓住这种交换的规律&#xff0c;可以大大提高资金的使用效率和总体收益&#xff01; 目前行情继续稳中有进&#xff0c;大饼也…

html--花瓣

代码 <!DOCTYPE html> <html lang"en" ><head> <meta charset"UTF-8"> <title>Petals</title><link rel"stylesheet" href"css/style.css"></head><body><div class"…

记录工作中莫名其妙的bug

1、问题&#xff1a;办公室的电脑突然除了我之外&#xff0c;都不能访问我们的线上系统了 原因&#xff1a;因为是内网&#xff0c;同事有刚刚升级了Windows11&#xff0c;配置的DNS被清了&#xff0c;还有同事换了公司的新电脑&#xff0c;还没有配DNS 位于&#xff1a;C /Win…

postman---postman参数化

我们在做接口测试的过程中&#xff0c;都会遇到同一个接口不同的数据&#xff0c;每次去一个个填写数据就太麻烦了&#xff0c;今天我们一起学习下如何通过postman进行参数化 一、参数化 参数化就是1个接口请求不同的数据&#xff0c;我们可以通过把请求的数据放入到一个文件…

创业板指399006行情数据API接口

# 测试&#xff1a;返回不超过10条数据&#xff08;2年历史&#xff09; https://tsanghi.com/api/fin/index/CHN/daily?tokendemo&ticker399006&order2Python示例 import requestsurl f"https://tsanghi.com/api/fin/index/CHN/daily?tokendemo&ticker399…

某团mtgsig1.1和_token逆向

前言 只作学习研究&#xff0c;禁止用于非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01; 目前已成功逆向&#xff01;&#xff01; 1.1版本适用于h5和小程序 使用python调用js逆向脚本&#xff0c;获取mtgsig 效…

【Python使用】python高级进阶知识md总结第4篇:静态Web服务器-命令行启动动态绑定端口号,html 的介绍【附代码文档】

python高级进阶全知识知识笔记总结完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;操作系统&#xff0c;虚拟机软件&#xff0c;Ubuntu操作系统&#xff0c;Linux内核及发行版&#xff0c;查看目录命令&#xff0c;切换目录命令&#xff0c;绝对路径和相对…

AI健身教练-引体向上-俯卧撑计数-仰卧起坐姿态估计-康复训练姿态识别-姿态矫正

在AI健身应用中&#xff0c;通过关键点检测技术可以实现对用户动作的精准捕捉和分析&#xff0c;从而进行统计计数和规范性姿态识别。 统计计数&#xff1a;比如在做瑜伽、健身操等运动时&#xff0c;系统可以通过对人体关键点&#xff08;如手部、脚部、关节等&#xff09;的…