第08讲 队列.pptVIP

  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文档。上传文档
查看更多
第08讲 队列

* 1.进一步思考为什么要设计这些操作受限的线性结构? 栈:数制转换、表达式求值、函数的嵌套调用 队列:银行排队系统、电梯运行、数据库系统故障恢复、操作系统作业排队 * 和顺序栈一样,顺序队列中用一组连续的存储单元依次存放从队头到队尾的所有元素;并附设两个指针分别指示队头和队尾。 每当插入一个新元素,队尾指针向后移一位; 每当删除一个元素,队头指针向后移一位; 因此,队头指针总指向队头元素,队尾指针总指向队尾元素的下一个位置。 §3.4 队列 ADT队列的定义 队列的链式表示和实现 队列的顺序表示和实现 3.4.1 队列 队列是一种先进先出(first in first out, 即FIFO)的线性表。只允许在表的一端进行插入,另一端进行删除。 什么叫队列 e.g.车站买票:先来的人先买到先离开,后 到的人后买到后离去。 a1 a2 a3 ……. an 插入 删除 队尾 队头 队列 (Queue) 例如:队列 Q= (a1 , a2 , a3 , ……….,an-1 , an ) 在队尾插入元素称为入队;在队首删除元素称为出队。 队首 队尾 问:为什么要设计队列?它有什么独特用途? 离散事件的模拟(模拟事件发生的先后顺序,例如 CPU芯片中的指令译码队列); 操作系统中的作业调度(一个CPU执行多个作业); 3. 简化程序设计。 答: 队列的ADT定义 ADT Queue{ } ADT Queue QueueLength(Q) GetHead(Q, e) QueueEmpty(Q) QueueTraverse(Q) InitQueue(Q) DestroyQueue(Q) EnQueue(Q, e) DeQueue(Q, e) ClearQueue(Q) 数据对象:D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 } 数据关系:R1={ ai-1, ai | ai-1, ai∈D, i=2,...,n} 约定a1 端为队头,an 端为队尾。 基本操作: 队列代码定义 typedef struct Queue{ Elemtype *base; Elemtype *front; Elemtype *rear; int queuesize; }; Q (队尾) (队首) front a1 a2 a3 data a4 0 . . . . . . . 99 rear ② 队列会满吗? 极易装满!因为数组通常有长度限制,而其前端空间无法释放。 ① 空队列的特征? 约定:front=rear 队尾后地址 入队(尾部插入):Q.rear-data=e; Q.rear++ ; 出队(头部删除):e=Q.front-data;Q. front++; 讨论: 假溢出! 有缺陷 ③ 怎样实现入队和出队操作?核心语句如下: 用base做数组名 e 顺序队示意图: 解决假溢出的途径——— 采用循环队列 答:在顺序队中,当尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫“假溢出”。 问:什么叫“假溢出” ?如何解决? 1)写出下列程序段的输出结果: void main( ){ Queue Q; InitQueue(Q); char x=e, y=c; EnQueue(Q,h); EnQueue(Q,r); EnQueue(Q,y); DeQueue(Q,x); EnQueue(Q,x); DeQueue(Q,x); EnQueue(Q,a); while (!QueueEmpty(Q)){ DeQueue(Q,y); printf(y); } printf(x); } 练习 2)分析算法功能 void algo3(Queue Q){ Stack S; int d; InitStack(S); while (!QueueEmpty(Q)){ DeQueue(Q,d); Push(S,d); } while (!StackEmpty(S)){ Pop(S,d); EnQueue(Q,d); } } 双端队列 限定插入和删除在表的两端进行的线性表。 a1 a2 a3 ……. an 插入 删除 插入 删除 插入 a1 a2 a3 ……. an 插入 删除

文档评论(0)

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

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

1亿VIP精品文档

相关文档