《数据结构第3章》课件.ppt

  1. 1、本文档共77页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * 3、顺序队列的“假溢出”问题 (1)假溢出   顺序队列因多次入队和出队操作后出现的有存储空间但不能进行入队操作的溢出。 (2)如何解决顺序队列的假溢出问题? 可采取四种方法:  1)采用顺序循环队列;(教材中的方法) 2)按最大可能的进队操作次数设置顺序队列的最大元素个数;(最差的方法) 3)修改出队算法,使每次出队列后都把队列中剩余 数据元素向队头方向移动一个位置;  4)修改入队算法,增加判断条件,当假溢出时,把队列中的数据元素向对头移动,然后方完成入队操作。 * 四、顺序循环队列的表示和实现 1、顺序循环队列的基本原理 把顺序队列所使用的存储空间构造成一个逻辑上首尾相连的循环队列。当rear和front达到MaxQueueSize-1后,再前进一个位置就自动到0。     顺序队列 a3 a2 a1 front rear 0 1 2 3 . . N-1 a3 a2 a1 0 1 2 3 N-1 rear front 循环队列 * 例: 一循环队列如下图所示,若先删除4个元素,接着再插入4个元素,请问队头和队尾指针分别指向哪个位置? J2 J3 J1 J4 J5 front=1 rear=0 解:由图可知,队头和队尾指针的初态分别为front=1和rear=0。 删除4个元素后f=5; 再插入4个元素后,r=(0+4)%6=4 front=5 J6 J5 J7 J8 J9 rear=4 rear=0 front=5 2.顺序循环队列的队空和队满判断问题 新问题:在顺序循环队列中,队空特征是front=rear;队满时也会是 front=rear;判决条件将出现二义性!解决方案有三: ①使用一个计数器记录队列中元素个数(即队列长度); (教材中的方法)   判队满:count0 rear==front 判队空:count==0 ②设标志位,出队时置0,入队时置1,则可识别当前front=rear 属于何种情况   判队满:tag==1 rear==front 判队空:tag==0 rear==front ③ 少用一个存储单元   判队满: front==(rear+1)%MaxQueueSize 判队空: rear==front * 3、顺序循环队列的实现 采用对顺序循环队列的分析,其结构体定义为: typedef struct { DataType queue[MaxQueueSize]; int rear; /*队尾指针*/ int front; /*队头指针*/ int count; /*计数器*/ } SeqCQueue; * 讨论:循环队列的基本操作如何实现? 以建队、入队和出队三种基本操作为例 1)初始化一个顺序循环队列 算法要求:生成一空队列 算法操作: 设置队列为空队列,其特征即: front=rear=0,count=0 * 具体算法: void QueueInitiate(SeqCQueue *Q) /*初始化顺序循环队列Q*/ { Q-rear = 0; /*定义初始队尾指针下标值*/ Q-front = 0; /*定义初始队头指针下标值*/ Q-count = 0; /*定义初始计数器值*/ } * 算法说明:向循环队列的队尾插入一个元素 分 析: (1) 插入前应当先判断队列是否满? if (Q-count0 Q-rear==Q-front) return 0; (2)插入动作 Q-queue[Q-rear] = x; Q-rear = (Q-rear + 1) % MaxQueueSize; Q-count++; return 1; 2) 入队操作 队列尺寸 * int QueueAppend(SeqCQueue *Q, DataType x) { if(Q-count 0 Q-rear == Q-front) { printf(队列已满无法插入! \n); return 0; } else { Q-queue[Q-rear] = x; Q-rear = (Q-rear + 1) % MaxQueueSiz

文档评论(0)

秦圈圈 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档