数据结构第6课队列.pptxVIP

  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文档。上传文档
查看更多
队列数据结构之三出队a1 , a2 , … , an入队队尾队首6.1 队列基本概念1 队列的基本概念队列(Queue):也是运算受限的线性表。只允许在表的一端进行插入,而在另一端进行删除。 队首(front) :允许进行删除的一端称为队首。 队尾(rear) :允许进行插入的一端称为队尾。 例如:排队购物,先进入队列的成员总是先离开队列。  先进先出6.2 队列的顺序表示和实现 利用一维数组依次存放从队首到队尾的各个元素,称为顺序队列。 其类型定义如下:#define MAX 100struct queue{ int queue_a[MAX] ;int front ;int rear ;};6.2 队列的顺序存储结构 设立一个队首指针front ,一个队尾指针rear 。 ◆ 初始化:front=rear=0。 ◆ 入队:将新元素插入rear所指的位置,然后rear加1 ◆ 出队:返回被删元素,然后删去front所指的元素,front加1。 ◆ 队列为空:front=rear。◆ 队满:rear=MAX或front=rear。Q.rearQ.frontQ.frontQ.fronta5Q.rearQ.frontQ.rearQ.reara4a3a2a1(a) 空队列入队3个元素(c) 出队3个元素(d) 入队2个元素图3-6队列示意图6.2 队列的顺序存储结构顺序队列中存在“假溢出”现象。因为在入队和出队操作中,头、尾指针只增加不减小,致使被删除元素的空间永远无法重新利用。习题一 设q[0,6]是一个静态顺序队列,初始状态为front=rear=0,请画出做完下列操作后队列的头尾指针的状态变化情况,若不能入队,请指出其元素,并说明理由。a, b, c, d入队a, b, c出队i , j , k , l , m入队d, i出队n, o, p, q, r入队6.3循环队列 为充分利用向量空间,克服上述“假溢出”现象的方法是:将为队列分配的空间看成为一个首尾相接的圆环,并称这种队列为循环队列(Circular Queue)。 在循环队列中进行出队、入队操作时,队首、队尾指针仍要加1,朝前移动。只不过当队首、队尾指针指向上界(MAX-1)时,其加1操作的结果是指向下界0。这种加1操作可以描述为:if (i+1==MAX)i=0;elsei++ ;//其中: i代表队首指针(front)或队尾指针(rear)用取余运算可简化为:i=(i+1)%MAX;frontrearfrontfrontrearrear000d111e222b555b333444gg(c) d, e出队(b) d, e, b, g入队(a) 空队列6.3循环队列例:设有循环队列qu[0,5],其初始状态是front=rear=0,各种操作后队列的头、尾指针的状态变化情况如下图所示。 frontfrontfrontrearrearrearkrk000111k222555jpbjj333444igii(f) r, p, s, t入队(d) i, j, k入队(e) b, g出队 循环队列操作及指针变化情况6.3循环队列6.3循环队列入队时尾指针向前追赶头指针出队时头指针向前追赶尾指针故队空和队满时头尾指针均相等。因此,无法通过front=rear来判断队列“空”还是“满”。解决的方法是:约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满。即:rear所指的单元始终为空(浪费一个空间)。循环队列为空:front=rear 循环队列满:(rear+1)%MAX =front习题二假设q[0,5]是一个循环队列,初始状态为front=rear=0,请画出做完下列操作后队列的头尾指针的状态变化情况,若不能入队,请指出其元素,并说明理由。d, e, b, g, h入队d, e出队i , j , k , l , m入队b出队n, o, p, q, r入队 循环队列的基本操作1 循环队列的初始化queue init_CirQueue(void){ queue q ;q.front=q.rear=0; return(q) ;} 循环队列的基本操作2 入队操作int insert_CirQueue(queue q , int e) /* 将数据元素e插入到循环队列Q的队尾 */{ if ((q.rear+1)%MAX== q.front) return ERROR; /* 队满,返回错误标志 */q.qa[q.rear]=e ;//元素e入队q.rear=(q.rear+1)% MAX;// 队尾指针向前移动return OK; /* 入队成功 */} 循环队列的基本操作3 出队操作int

文档评论(0)

过各自的生活 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档