第九章 环形队列实现原理 链式实现.docxVIP

第九章 环形队列实现原理 链式实现.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文档。上传文档
查看更多
环形队列实现原理 /链式实现环形队列是在实际编程极为有用的数据结构,它有如下特点。?? 它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单。能很快知道队列是否满为空。能以很快速度的来存取数据。?? 因为有简单高效的原因,甚至在硬件都实现了环形队列.??? 环形队列广泛用于网络数据收发,和不同程序间数据交换(比如内核与应用程序大量交换数据,从硬件接收大量数据)均使用了环形队列.?一.环形队列实现原理------------------------------------------------------------?? 内存上没有环形的结构,因此环形队列实上是数组的线性空间来实现。那当数据到了尾部如何处理呢?它将转回到0位置来处理。这个的转回是通过取模操作来执行的。?? 因此环列队列的是逻辑上将数组元素q[0]与q[MAXN-1]连接,形成一个存放队列的环形空间。?? 为了方便读写,还要用数组下标来指明队列的读写位置。head/tail.其中head指向可以读的位置,tail指向可以写的位置。???环形队列的关键是判断队列为空,还是为满。当tail追上head时,队列为满时,当head追上tail时,队列为空。但如何知道谁追上谁。还需要一些辅助的手段来判断.??? 如何判断环形队列为空,为满有两种判断方法。??1.是附加一个标志位tag????? 当head赶上tail,队列空,则令tag=0,????? 当tail赶上head,队列满,则令tag=1,2.限制tail赶上head,即队尾结点与队首结点之间至少留有一个元素的空间。??????队列空:?? head==tail????? 队列满:?? (tail+1)% MAXN ==head?二.附加标志实现算法采用第一个环形队列有如下结构typedefstructringq{?? int head; /* 头部,出队列方向*/?? int tail; /* 尾部,入队列方向*/ ?? int tag ;?? int size ; /* 队列总尺寸 */?? int space[RINGQ_MAX]; /* 队列空间 */?}RINGQ;初始化状态:?q-head = q-tail = q-tag = 0;队列为空:(q-head == q-tail) (q-tag == 0)队列为满: ((q-head == q-tail) (q-tag == 1))入队操作:如队列不满,则写入???? q-tail =? (q-tail + 1) % q-size ;出队操作:如果队列不空,则从head处读出。??? 下一个可读的位置在?q-head =? (q-head + 1) % q-size?完整代码???头文件ringq.h#ifndef __RINGQ_H__#define __RINGQ_H__#ifdef __cplusplusextern C {#endif#define QUEUE_MAX 20typedefstructringq {int head; /* 头部,出队列方向*/int tail; /* 尾部,入队列方向*/int tag ; /* 为空还是为满的标志位*/int size ; /* 队列总尺寸 */int space[QUEUE_MAX]; /* 队列空间 */ } RINGQ; /*第一种设计方法:当head == tail 时,tag = 0 为空,等于 = 1 为满。 */externintringq_init(RINGQ *p_queue);externintringq_free(RINGQ *p_queue); /* 加入数据到队列 */externintringq_push(RINGQ *p_queue, int data); /* 从队列取数据 */externintringq_poll(RINGQ *p_queue, int *p_data);#define ringq_is_empty(q) ( (q-head == q-tail) (q-tag == 0))#define ringq_is_full(q) ( (q-head == q-tail) (q-tag == 1))#define print_ringq(q) printf(ring head %d,tail %d,tag %d\n, q-head,q-tail,q-tag);#ifdef __cplusplus}#endif#endif /* __RINGQ_H__ */实现代码ringq.c#include stdio.h#include ringq.hintringq_init(RINGQ *p_queu

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档