首页
学习
活动
专区
工具
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

36320

go 环形队列

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

92920

稀疏数组 & 环形队列

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

43620

4-1-关于环形队列

现在看看实际的 1.环形队列管理程序 ?...3.通过环形队列函数往数组里面存数据 ? ? ? 4.通过环形队列函数往数组里面存数据 ? 5.取出来几个数据 ? ? 咱存储数据的时候存储的顺序是 1,2,3,4,5,6依次存进去的....其实黄框位置在环形队列管理函数里面认为是空位置. 现在看典型应用 1,说明 首先环形队列适用于很多场合,尤其是一边存数据一边处理数据的场合. 2.使用环形队列缓存串口数据 ? ? ?...我的所有的项目都是使用的环形队列做数据处理..../yangfengwu/p/14620102.html 4.用户只需要知道,环形队列就是一个缓存数据的方式 此节代码中还有使用中断发送数据,缓存也是使用的环形队列 其实就是把数据放到环形队列,然后打开中断发送

37630

go语言数据结构 环形队列

1.环形队列是什么 队列是一种常用的数据结构,这种结构保证了数据是按照“先进先出”的原则进行操作的,即最先进去的元素也是最先出来的元素.环形队列是一种特殊的队列结构,保证了元素也是先进先出的,但与一般队列的区别是...C代码实现见:https://github.com/dodng/fast_ring_queue 2.环形队列的优点   1.保证元素是先进先出的 是由队列的性质保证的,在环形队列中通过对队列的顺序访问保证...在最典型的生产者消费者模型中,如果引入环形队列,那么生成者只需要生成“东西”然后放到环形队列中即可,而消费者只需要从环形队列里取“东西”并且消费即可,没有任何锁或者等待,巧妙的高效实现了多线程数据通信。...3.环形队列的工作场景 一般应用于需要高效且频繁进行多线程通信传递数据的场景,例如:linux捕包、发包等等,(linux系统中对PACKET_RX_RING和PACKET_TX_RING的支持实质就是内核实现的一种环形队列...4.3元素状态切换 有种很巧妙的方法,就是在队列中每个元素的头部加一个元素标示字段,标示这个元素是可读还是可写,而这个的关键就在于何时设置元素的可读可写状态,参照linux内核实现原理,当这个元素读取完之后

1.7K30

丢给你个环形队列玩玩

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

41750

Linux】生产者消费者模型——环形队列RingQueue(信号量)

引入环形队列 环形队列之前我们就了解过了,只要是环形队列,就存在判空判满的问题。...实际上并不是真正的环形队列,而是通过数组模拟的,当数据加入到最后的位置时直接模等于数组的大小即可。...访问环形队列 生产者和消费者访问同一个位置的情况:空的时候,满的时候;其他情况下生产者与消费者访问的就是不同的区域了。...大部分情况下生产者与消费者是并发执行的,但是当环形队列为空或为满的时候就会存在着同步与互斥问题。...],nullptr); for(int i = 0 ;i<8;i++) pthread_join(c[i],nullptr); return 0; } 总结 多生产多消费的意义:不管是环形队列还是阻塞队列

32340

Linux】生产者消费者模型:基于阻塞队列环形队列 | 单例模式线程池

阻塞队列就是生产者和消费者的共享容器,生产者是从数据到阻塞队列中,消费者从阻塞队列中拿数据。...需要注意的是: 当阻塞队列为空时,消费者不可以从阻塞队列中拿数据,此时消费者进入条件变量队列下等待,当消费了一个数据,就可以唤醒一个生产者生产了 当阻塞队列满时,生产者不可以向阻塞队列中生产数据,此时生产者进入条件变量队列下等待...mutex; //锁 pthread_cond_t _c_cond; //消费者的条件变量 pthread_cond_t _p_cond; //生产者的条件变量 }; 四.基于环形队列的生产者消费者模型...int sem_post(sem_t *sem);//V() 环形队列环形队列为空或为满时,生产者和消费者才会相遇 消费者不能超过生产者,生产者不能超过消费者一个圈  生产者关心的是还剩多少剩余空间...linux中也有一批关于自旋锁的接口:  用法都和互斥锁的类似。

22710

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

刚好,之前发关于环形队列的文章有些问题,这次刚好拿出来一起说一下,并用柔性数组实现一个环形队列。...柔性数组的上一篇文章 环形队列C语言实现文章 1、环形队列文章之前的代码有bug /*插入数据*/ int ring_buff_insert(struct ring_buff * p_ring_buff...4、使用柔性数组实现环形队列 /* 实现的最简单的ringbuff 有更多提升空间,可以留言说明 */ #include "stdio.h" #include "stdlib.h" #include "...time.h" #define LEN 64 typedef int datatype; /*环形队列结构体*/ typedef struct ring_buff{ int W;...*/ int get_ring_buff_fullstate(struct ring_buff * p_ring_buff) { /*如果写位置减去读位置等于队列长度,就说明这个环形队列已经满*

53340

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

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

1.8K20

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

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

84340

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

环形队列 2.1. 环形队列的特点 普通队列的入队操作将队尾指针后移+1,出队操作将队头指针后移+1,操作几次之后会发现队头指针和队尾指针都跑到缓冲区的尾部去了: ?...显然这种队列使用方式太不方便了,所以就诞生了环形队列:「不用搬移元素和指针,一直可以重复利用这段内存空间」。 ? 2.2....环形队列的实现 TencentOS-tiny中环形队列的实现在tos_ring_queue.h和tos_ring_queue.c中。...优先级队列的实现 TencentOS-tiny中环形队列的实现在tos_prio_queue.h和tos_prio_queue.c中。...总结 ① 普通队列是一种只能在一端入队,在一端出队的数据结构,规则:FIFO。 ② 环形队列对内存空间的利用率最高,使用最多,规则:FIFO。

82320

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

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

43040
领券