首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

04 环形队列

04 环形队列 上一章说到的数组模拟队列存在的问题,问题分析并优化 目前数组使用一次就不能用,没有达到复用的效果 将这个数组使用算法,改进成一个环形队列 1.数组模拟环形队列 对前面的数组模拟队列的优化...因此将数组看做是一个环形的。(通过去模的方式来实现即可) 分析说明: 尾索引的下一个为头索引时,表示队列满。...即将队列容量空出一个作为约定,这个在做判断队列满的时候需要注意(rear+1)%maxsize==front 满 rear==front 空 实现思路如下: front指针含义调整,front指向队列第一个元素...也就是array[front]就是队列的第一个元素。front初始值=0。 rear变量的含义调整,rear指向队列的最后一个元素的后一个位置。因为希望空出一个空间作为约定。rear初始值=0。...(为什么要取模,因为是环形同时有rear可能是最大的然后跑到最前面来;假如:rear=1,front=0,maxsize=10 再套入公式中 (1+10-0)%10=1 有效数据为1) 2.代码实现 public

35220

go 环形队列

环形队列 队列又称为“先进先出”(FIFO)线性表,限定只能在队尾插入,在队首删除 顺序队列:顺序存储结构,数组 链队列:链表结构。...内存上并没有环形的结构,因此环形队列实际上是数组的线性空间来实现的。 当数据到了尾部该如何处理呢?...它将转回到原来位置进行处理,通过取模操作来实现 golang环形队列实现 什么是环形队列 如图所示,一个环形队列.含有二个指针: 队列头指针,队列尾指针....实现环形队列图示过程 初始化一个数组大小为6的环形队列, 头指针front=0, 尾指针rear=0, 刚好front=rear =0的状态,表示环形队列为空. 2.向环形队列里插入1个元素,则rear...// 环形队列 type CircleQueue struct { length int // 队列长度 head int // 指向队列首 0 tail int // 指向队列

84320

稀疏数组 & 环形队列

二、环形队列 1、普通队列存在什么问题?...队列大家都知道,有几个重要的属性: rear:指向队列的尾巴,即最后一个元素所在的位置,初始值为-1 front:指向队列的头部的前一个位置,初始值也为-1 capacity:队列的容量 空队列的rear...这时队列明明是空的,但是却不能再入队元素的,因为满足rear = capacity - 1,也就是相当于这队列是一次性的,用过之后就不能再用了,即使为空也不能再入队了,造成空间的浪费,所以环形队列就出现了...2、环形队列实现思路: 环形队列中的几个重要属性: rear:指向队列尾巴的后一个位置,初始值为0 front:指向队列的头部,即第一个元素所在的位置,初始值为0 capacity:队列的容量 下面是环形队列的一些算法...入队操作时:rear = (rear + 1) % capacity 出队操作时:front = (front + 1) % capacity; 判断队列是否已满是环形队列中最重要也是最难理解的地方

43020

go语言数据结构 环形队列

1.环形队列是什么 队列是一种常用的数据结构,这种结构保证了数据是按照“先进先出”的原则进行操作的,即最先进去的元素也是最先出来的元素.环形队列是一种特殊的队列结构,保证了元素也是先进先出的,但与一般队列的区别是...,他们是环形的,即队列头部的上个元素是队列尾部,通常是容纳元素数固定的一个闭环。...C代码实现见:https://github.com/dodng/fast_ring_queue 2.环形队列的优点   1.保证元素是先进先出的 是由队列的性质保证的,在环形队列中通过对队列的顺序访问保证...在最典型的生产者消费者模型中,如果引入环形队列,那么生成者只需要生成“东西”然后放到环形队列中即可,而消费者只需要从环形队列里取“东西”并且消费即可,没有任何锁或者等待,巧妙的高效实现了多线程数据通信。...//环形队列实现 队列,先进先出。

1.6K30

丢给你个环形队列玩玩

一,其实环形队列就是利用一些函数把一个数组的首位连接起来,然后实现如下功能 环形队列的存在解决了一个最典型的问题: 假设我需要处理10000个字节的数据,就是串口一次性会发过来10000个字节,然后单片机每次取...利用环形队列的话,我可以定义一个20字节的数组,串口中断里面不停的往里面存数据,我主循环不停的查询这个数组里面是否够10字节了, 如果够了,我就从里面取出来10字节处理,然后不停的循环....三,创建一个数组   创建一个环形队列管理变量  然后把数组交给环形队列函数去管理 ? ? ? 四,把数据写入环形队列 ? 五,读出数据,输出每10个数据的累加和  ? ?...如果环形队列满了,这个标志位将置位 处理数据的时候判断一下这个标志位是否置位,如果置位说明本次的数据有丢失!

40650

柔性数组和环形队列之间的故事

刚好,之前发关于环形队列的文章有些问题,这次刚好拿出来一起说一下,并用柔性数组实现一个环形队列。...柔性数组的上一篇文章 环形队列C语言实现文章 1、环形队列文章之前的代码有bug /*插入数据*/ int ring_buff_insert(struct ring_buff * p_ring_buff...4、使用柔性数组实现环形队列 /* 实现的最简单的ringbuff 有更多提升空间,可以留言说明 */ #include "stdio.h" #include "stdlib.h" #include "...*/ int get_ring_buff_fullstate(struct ring_buff * p_ring_buff) { /*如果写位置减去读位置等于队列长度,就说明这个环形队列已经满*...关于环形队列是否为空的判断,大家可以思考下,还有没有更好的判断方式,欢迎踊跃留言。

52440

来看看加入环形队列的串口发送数据

一,为什么要使用环形队列来发送数据?是为了解决什么问题呢! ? 这节说了怎么用中断发送数据,但是大家是否想过,这种中断发送有个bug,看一下下面的 ? ?...直接利用环形队列是很好的选择. 我把发送的数据写入环形队列,然后打开串口发送中断 串口发送中断里面判断环形队列里面的数据个数是不是大于0,如果是就读出来发出去! 二,定义一些变量 ? ? ? ?...三,然后把数组交给 环形队列变量去管理 ? 四,串口发送中断里面就是这样 ? 五,修改一下环形队列的一个函数,填充完数据就打开中断 ? 六,现在测试 ? ? 现在的数据不会出现丢失!...注意:即使是使用了环形队列也不要在主循环里面 ? 环形队列缓存也有限! 只要波特率定好了,中断发送每一位数据的时间是一定的,发送数据就一定需要时间! 现在是直接造成死机, ?...其实造成死机的原因是因为环形队列里面使用的printf, ? 而printf 并不是中断发送,造成了冲突 ? 改一下 ? ?

1.8K20

环形队列到底是怎么回事?

前两天看到一位朋友 作者发哥的一篇C语言环形队列文章:C语言,环形队列,写的非常好。...C++里有现成的队列函数,但是C语言需要自己来实现,我之前项目里用到了Github上的一个代码,https://github.com/kuaileguyue/Ring-Buffer ,简洁好用。...那时就是用,因为大概知道原理,就没有认真的去分析代码的实现细节,这次刚好看到发哥文章下有很多关于环形队列的留言讨论,我就详细的去看了一下之前用的代码,发现收获还是不小的,在此分享给大家。...问题1:如何初始化环形队列? 回答:只要定义一个ring_buffer_t类型的结构体,然后调用ring_buffer_init()函数初始化即可。...#define RING_BUFFER_SIZE 128 问题3:为什么环形队列长度必须是2的n次方?

80640

数据结构 | TencentOS-tiny中队列环形队列、优先级队列的实现及使用

环形队列 2.1. 环形队列的特点 普通队列的入队操作将队尾指针后移+1,出队操作将队头指针后移+1,操作几次之后会发现队头指针和队尾指针都跑到缓冲区的尾部去了: ?...显然这种队列使用方式太不方便了,所以就诞生了环形队列:「不用搬移元素和指针,一直可以重复利用这段内存空间」。 ? 2.2....环形队列的实现 TencentOS-tiny中环形队列的实现在tos_ring_queue.h和tos_ring_queue.c中。...环形队列使用Demo 编写如下的测试代码: #include typedef struct item_st { int a; int b; int c; }...优先级队列的实现 TencentOS-tiny中环形队列的实现在tos_prio_queue.h和tos_prio_queue.c中。

78120

【RTOS训练营】作业讲解、队列环形缓冲区、队列——传输数据、队列——同步任务和晚课提问

改成这样就没问题: 现在可以看到了,空闲任务运行的时间非常非常短: 二:队列环形缓冲区 队列没什么复杂的,本质就是一个环形缓冲区,再加上任务的休眠和唤醒。...对于环形缓冲区,它有如下要点: 有读写位置 写到buff的尾部之后,要绕到头部 读到buff的尾部之后,要绕到头部 这里再复习下环形缓冲区。...“环形缓冲区”那几个文字一个指向的是“写位置”,另一个指向的是“读位置”。...在以前讲环形缓冲区的时候,有同学问过一个问题:能不能够创建一个通用的环形缓冲区?可以用来传递任意大小的数据。 可以,队列就是:你可以指定这个环形缓冲区里每一个元素多大,有多少个元素。...2.并且会把自己放在队列的这个链表上xTasksWaitingToReceive 即一个任务,想去读队列,但是队列里没有数据,就休眠:会把自己放入两个链表。

39140

信号量基于环形队列的生产消费者模型

int sem_post(sem_t *sem);//V() 基于环形队列的生产消费者模型 环形队列采用数组模拟,用模运算来模拟环状特性,即对数组的访问,下标采用下标模数组长度的形式来模拟环形队列。...消费者把数据拿走,不会归还给环形队列了,因此的环形队列中空了一格出来,因此归还资源,归还的是生产者的资源。...RingQueue *rq = new RingQueue();//环形队列 pthread_t p,c; pthread_create(&p,nullptr...而在这里的环形队列当中,只需要保证一个生产者,一个消费者在环形队列里面即可,也就是说需要两把锁,一个给生产者,一个给消费者,两个互不干扰,你忙你的我忙我的。...RingQueue *rq = new RingQueue();//环形队列 pthread_t p[4], c[8]; for(int i = 0;

30920

disruptor笔记之三:环形队列的基础操作(不用Disruptor类)

《disruptor笔记》系列链接 快速入门 Disruptor类分析 环形队列的基础操作(不用Disruptor类) 事件消费知识点小结 事件消费实战 常见场景 等待策略 知识点补充(终篇) 本篇概览...本文是《disruptor笔记》系列的第三篇,主要任务是编码实现消息生产和消费,与《disruptor笔记之一:快速入门》不同的是,本次开发不使用Disruptor类,和Ring Buffer(环形队列...前文回顾 为了完成本篇的实战,前文《disruptor笔记之二:Disruptor类分析》已做了充分的研究分析,建议观看,这里简单回顾以下Disruptor类的几个核心功能,这也是咱们编码时要实现的: 创建环形队列...StringEvent newInstance() { return new StringEvent(); } } 事件生产类,定义如何将业务逻辑的事件转为disruptor事件发布到环形队列...Override public long eventCount() { return eventCount.get(); } } 上述代码有以下几处需要注意: 自己创建环形队列

29220
领券