第三章 数据结构与算法_线性结构(三).ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2.3 队列及实现 1. 定义(queue) 只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。 与一般线性表的区别:仅在于运算规则不同。 2. 构成 队头(front):在表中只允许进行删除的一端; 队尾(rear):只允许进行插入另一端。 举例: 注意: 空队(无元素)队头与队尾相遇 逻辑结构(a1—a2—a3) … a3 a2 a1 … 队头 队尾 3. 运算规则 只能在队头和队尾运算,且访问结点时按照先进先出(FIFO)的原则。 4. 逻辑结构 与线性表相同,仍为一对一( 1:1)关系。 5. 主要运算 (1)入队—在队尾插入元素; (2)出队—在队头删除元素。 6. 基本操作 入队或出队,建空队列,判队空或队满等操作。 7. 存储结构(两种) 顺序队列,队列的数组表示,使用时常被臆想为一个环状空间,因此又称为循环队列。 链队列,队列的链式表示,适于用户无法预估空间的情况。 8.队列的抽象数据类型描述 类型名称:队列(Queue) 数据对象集:一个有0个或多个元素的有穷线性表。 操作集:长度为MaxSize的队列Q,队列元素item; 1、Queue CreatQueue( int MaxSize ):生成长度为MaxSize的空队列; 2、int IsFullQ( Queue Q, int MaxSize ):判断队列Q是否已满; 3、void AddQ( Queue Q, ElementType item ): 将数据元素item插入 队列Q中; 4、ElementType DeleteQ( Queue Q ):将队头数据元素从队列中 删除并返回。 5、int IsEmptyQ( Queue Q ): 判断队列Q是否为空; 9.队列的顺序存储实现 队列的顺序存储结构通常由一个一维数组和一个记录队列头元 素位置的变量front以及一个记录队列尾元素位置的变量rear组成。将 队列头放数组下标小的位置,而将队列尾放在数组下标大的位置。一般 front和rear先初始化-1。当有元素入队,rear向右移动一格(加1), 放在队尾元素;当有元素出队,front向右移动一格(加1),再删除 对头元素。 #define MaxSize 储存数据元素的最大个数 struct QNode { ElementType Data[ MaxSize ]; int rear; int front; }; typedef struct QNode *Queue; 随着入队、出队操作的进行,会使整个队列整体向后移动,这样就出现队 尾指针已经移到了最后,再有元素入队就会出现溢出,而事实上此时队中 并未真的“满员”,这种现象称为“假溢出”。 〖例〗 一个工作队列 Front 0 Job 1 Rear 1 Job 2 Front 2 Job 3 Rear 3 Job 4 4 Job 5 Rear 5 Job 6 6 Job 7 Rear AddQ Job 1 AddQ Job 4 AddQ Job 7 AddQ Job 2 AddQ Job 5 AddQ Job 8 AddQ Job 3 AddQ Job 6 DeleteQ Job 1 DeleteQ Job 2   (a) 空队列 Q.front Q.rear 入队3个元素 a3 a2 a1 Q.front Q.rear (c) 出队3个元素 Q.front Q.rear (d) 入队2个元素 a5 a4 Q.front Q.rear 为充分利用向量空间,克服上述“假溢出”现象的方法是: 将为队列分配的数组看成为一个首尾相接的圆环,并称这种队列为循环 队列(Circular Queue)。 在循环队列中进行出队、入队操作时,队首、队尾指针仍要加1,朝前移动。 只不过当队首、队尾指针指向数组(MAX_QUEUE_SIZE-1)时,其加1 操作的结果是指向数组的下界0。 这种循环意义下的加1操作可以描述为: if (i+1==MAX_QUEUE_SIZE) i=0; else i++ ; 其中: i代表队首指针(front)或队尾指针(rear) 用模运算可简化为:i=(i+1)%MAX_QUEUE_SIZE ; 显然,为循环队列所分配的空间可以被充分利用,除非向量空间真的被队列元素全部占用,否则不会上溢。因此,真正实用的顺序队列是循环队列。 例:设有循环队列QU[0,5],其初始状态是front=rear=0,各种操作后队列的头、尾指针的状态变化情况如下图所示。

文档评论(0)

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

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

1亿VIP精品文档

相关文档