OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6744|回复: 6

学习下环形队列缓存,不知道有啥好

[复制链接]

45

主题

267

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1091
金钱
1091
注册时间
2018-6-24
在线时间
156 小时
发表于 2021-4-10 14:39:25 | 显示全部楼层 |阅读模式
#include <stdio.h>

#define M_S 3                        //定义数组长度,限制元素个数
//定义结构体
struct Queue
{
        int a[M_S];
        int front;                //前指针,指向队首
        int rear;                //后指针,指向对尾
};
//初始化
void InitQueue(struct Queue *p)
{
        p->front=p->rear=0;                        //初始化前后指针都指向0
}
//求长度
int QueueLength(struct Queue *p)
{
        return (p->rear-p->front+M_S)%M_S;        //求元素个数
}
//判断是否为空
short IsEmpty(struct Queue *p)
{
        if(p->front==p->rear)                //若前后指针指向同一个节点,则判断为空
                return 1;
        else
                return 0;
}
//判断是否为满
short IsFull(struct Queue *p)
{
        if(p->front==(p->rear+1)%M_S)                //若前指针等于(后指针+1)%数组大小,则判断为满
                return 1;
        else
                return 0;
}
//进队
short EnQueue(struct Queue *p,int key)
{
        if(IsFull(p))                                //若队列为满,则进队失败
                return 0;
        p->a[p->rear]=key;                        //否则将进队元素赋值给后指针所指的位置,后指针往后移动一格
        p->rear=(p->rear+1)%M_S;
        return 1;
}
//出队
short DeQueue(struct Queue *p,int *value)
{
        if(IsEmpty(p))                                //若队列为空,则出队失败
                return 0;
        *value=p->a[p->front];                        //传入一个指针保留出队元素,然后队首指向下一个元素
        p->front=(p->front+1)%M_S;
        return 1;
}
int main()
{
            unsigned char res;
        struct Queue c;         //定义结构体
        InitQueue(&c);          //调用初始化函数,初始队列
        res=EnQueue(&c,1);               //进队
        if(res==0)printf("第1人进队失败\r\n");
        res=EnQueue(&c,2);
        if(res==0)printf("第2人进队失败\r\n");
        res=EnQueue(&c,3);
        if(res==0)printf("第3人进队失败\r\n");
        res=EnQueue(&c,4);
        if(res==0)printf("第4人进队失败\r\n");
        int value;              //出队,输出
        while(DeQueue(&c,&value))
        {
                printf("---%d出队---还有%d人在队列---\n",value,QueueLength(&c));
        }
        return 0;

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2020-10-31
在线时间
137 小时
发表于 2021-4-12 08:42:01 | 显示全部楼层
回复 支持 反对

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2021-4-12 09:23:31 | 显示全部楼层
比如处理串口数据,而有些处理较为耗时可能直到下一个数据到来都还没处理完,就可能丢失数据。
有了循环队列,就可以在串口接收中断里把数据存入队列,主循环在有空时读取队列,慢慢处理。
专治疑难杂症
回复 支持 反对

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3447
金钱
3447
注册时间
2017-7-4
在线时间
869 小时
发表于 2021-4-12 11:15:15 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2017-10-10
在线时间
130 小时
发表于 2021-4-12 12:33:41 | 显示全部楼层
空间换时间
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2022-9-24
在线时间
6 小时
发表于 2022-9-29 15:05:28 来自手机 | 显示全部楼层
太棒了,明了
回复 支持 反对

使用道具 举报

32

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2013-1-16
在线时间
131 小时
发表于 2022-9-30 19:44:46 | 显示全部楼层
空间换时间
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 01:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表