什么是环形队列?C语言环形队列的特点与实现.docxVIP

什么是环形队列?C语言环形队列的特点与实现.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第 第 PAGE 1 页 共 NUMPAGES 1 页 什么是环形队列?C语言环形队列的特点与实现 一、什么是(环形)队列? 环形缓冲区是一个非常典型的数据结构,这种数据结构符合生产者,消费者模型,可以理解它是一个水坑,生产者不断的往里面灌水,消费者就不断的从里面取出水。 ? 那就可能会有人问,既然需要灌水,又需要取出水,为什么还需要开辟一个缓冲区内存空间呢?直接把生产者水管的尾部接到消费者水管的头部不就好了,这样可以省空间啊。 答案是不行的,生产者生产水的速度是不知道的,消费者消费水的速度也是不知道的,如果你强制接在一起,因为生产和消费的速度不同,就非常可能存在水管爆炸的情况,你说这样危险不危险? 在(音频)系统框架下,alsa就是使用环形队列的,在生产者和消费者速度不匹配的时候,就会出现xrun的问题。 二、环形队列的特点 1、数组构造环形缓冲区 假设我们用数组来构造一个环形缓存区,如下图所示: array[p_ring_buff-W%LEN] = data;p_ring_buff-W ++;//printf(inset:%d %d,data,p_ring_buff-W);return (0);}/*读取环形队列数据*/int ring_buff_get(struct ring_buff * p_ring_buff){int data = 0;if(p_ring_buff == NULL){ ? printf(p null); ? return (-1);}if(get_ring_buff_emptystate(p_ring_buff) == 1){printf(buff is empty);return (-2);}data = p_ring_buff-array[p_ring_buff-R%LEN];p_ring_buff-R++;return data;}/*销毁*/int ring_buff_destory(struct ring_buff * p_ring_buff){if(p_ring_buff == NULL){ ? printf(p null); ? return (-1);}free(p_ring_buff);return (0);}int main(){int i = 0;/*定义一个环形缓冲区*/ring pt_ring_buff = fifo_init();/*向环形缓冲区中写入数据*/for(i = 0;i ? array[p_ring_buff-W%LEN] = data;p_ring_buff-array[p_ring_buff-Wp_ring_buff-W ++;//printf(inset:%d %d,data,p_ring_buff-W);return (0);}/*读取环形队列数据*/int ring_buff_get(struct ring_buff * p_ring_buff){int data = 0;if(p_ring_buff == NULL){ ? printf(p null); ? return (-1);}if(get_ring_buff_emptystate(p_ring_buff) == 1){printf(buff is empty);return (-2);}//data = p_ring_buff-array[p_ring_buff-R%LEN];data = p_ring_buff-array[p_ring_buff-Rp_ring_buff-R++;return data;}/*销毁*/int ring_buff_destory(struct ring_buff * p_ring_buff){if(p_ring_buff == NULL){ ? printf(p null); ? return (-1);}free(p_ring_buff);return (0);}int main(){int i = 0;/*定义一个环形缓冲区*/ring pt_ring_buff = fifo_init();/*向环形缓冲区中写入数据*/for(i = 0;i ? 四、总结 环形队列的使用场景非常多,安卓的音频数据读写,很多都用到环形队列,我们在开发过程中使用的环形队列肯定比我上面的那个例子要复杂的多,我这里演示的是比较简单的功能,但麻雀虽小,五脏俱全,希望这个麻雀让你们了解这个数据结构,在实际项目中大展身手。 ?   

文档评论(0)

183****2409 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档