数据结构课件:第3章队列.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构课件:第3章队列.ppt》由用户(罗嗣辉)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课件 队列
- 资源描述:
-
1、数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖 队列的应用队列的应用数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖3.4 3.4 队列队列3.4.1 3.4.1 抽象数据类型队列的定义抽象数据类型队列的定义 也是一种运算受限的线性表。它只允许在也是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许删除的表的一端进行插入,而在另一端进行删除。允许删除的一端称为一端称为,允许插入的一端称为,允许插入的一端称为。例如:排队购物。操作系统中的作业排队。先进入队例如:排队购物。操作系统中的作业排队。先进入队列的成员总是先离开队列。因此队列亦称作
2、先进先出列的成员总是先离开队列。因此队列亦称作先进先出(First In First Out)(First In First Out)的线性表,简称的线性表,简称FIFOFIFO表。表。当队列中没有元素时称为当队列中没有元素时称为。在空队列中依次加。在空队列中依次加入元素入元素a a1 1,a,a2 2, ,a an n之后,之后,a a1 1是是,a an n是是。显然退出队列的次序也只能是。显然退出队列的次序也只能是a a1 1,a,a2 2, ,a an n ,也就是说,也就是说队列的修改是依队列的修改是依先进先出先进先出的原则进行的。的原则进行的。数数 据据 结结 构构 武汉大学测绘学
3、院虞晖武汉大学测绘学院虞晖下图是队列的示意图:下图是队列的示意图: 队列的抽象数据定义见书队列的抽象数据定义见书59数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖队列的基本运算队列的基本运算 队列可定义如下五种基本运算:队列可定义如下五种基本运算:1初始化队列初始化队列 InitQueue(&Q) 将队列将队列Q设置成一个空队列。设置成一个空队列。2入队列入队列 EnQueue(&Q,X) 将元素将元素X插入到队尾中,也称插入到队尾中,也称“进队进队” ,“插入插入”。 3出队列出队列 DeQueue(&Q,&e) 将队列将队列Q的队头元素删除,并用的队头元素删除,并用e返回
4、其值,也称返回其值,也称“退队退队”、“删除删除”。4取队头元素取队头元素 GetHead(Q,&e) 得到队列得到队列Q的队头元素之值,并用的队头元素之值,并用e返回其值。返回其值。5判队空判队空 QueueEmpty(Q) 判断队列判断队列Q是否为空,若为空返回是否为空,若为空返回1,否则返回,否则返回0。数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖3.4.2 非循环队列和循环队列非循环队列和循环队列队列的顺序存储结构称为顺序队列,顺序队列实队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表,和顺序表一样,顺序队列际上是运算受限的顺序表,和顺序表一样,顺序
5、队列也是必须用一个向量空间来存放当前队列中的元素。也是必须用一个向量空间来存放当前队列中的元素。由于队列的队头和队尾的位置是变化的,因而要设由于队列的队头和队尾的位置是变化的,因而要设两两个指针和分别指示队头和队尾元素在队列中的位置,个指针和分别指示队头和队尾元素在队列中的位置,它们的初始值在队列初始化时均应置为。入队时将它们的初始值在队列初始化时均应置为。入队时将新元素插入所指的位置,然后尾指针加。出队时,新元素插入所指的位置,然后尾指针加。出队时,删去所指的元素,然后头指针加并返回被删元素。删去所指的元素,然后头指针加并返回被删元素。由此可见,由此可见,当头尾指针相等时队列为空当头尾指针相
6、等时队列为空。在非空队列在非空队列里,头指针始终指向队头元素,而尾指针始终指向队里,头指针始终指向队头元素,而尾指针始终指向队尾元素的下一位置。尾元素的下一位置。数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖队列的顺序存储结构定义:队列的顺序存储结构定义:#define MAXQSIZE 100typedef struct ElemType dataMAXQSIZE; int front; int rear;SqQueue;数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖 0 1 2 3FrontrearabcFront rear (a)(a)队列初始为空(队
7、列初始为空(b b)A,B,CA,B,C入队入队 b c front rear front rear(c) a出队出队 (d) b,c出队,队为空出队,队为空 数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖n队空:队空:Q.front=Q.rearn队满:队满:Q.rear=maxsize(假溢出)(假溢出)求队长:求队长: Q.rear-Q.frontn 入队:新元素按入队:新元素按 rear 指示位置加入,指示位置加入,再将队尾指针加一再将队尾指针加一 ,即,即 rear = rear + 1n 出队:将出队:将front指示的元素取出,再将队指示的元素取出,再将队头指针
8、加一,即头指针加一,即front = front + 1,非循环队列非循环队列数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖和栈类似,队列中亦有上溢和下溢现象。此外,顺序队列中还存在“假上溢”现象。因为在入队和出队的操作中,头尾指针只增加不减小,致使被删除元素的空间永远无法重新利用。因此,尽管队列中实际的元素个数远远小于向量空间的规模,但也可能由于尾指针巳超出向量空间的上界而不能做入队操作。该现象称为假上溢。数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖 为充分利用向量空间,克服上述假上为充分利用向量空间,克服上述假上溢现象,可以将向量空间想象为一个首溢现象
9、,可以将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向尾相接的圆环,并称这种向量为循环向量,存储在其中的队列称为量,存储在其中的队列称为循环队列(循环队列(Circular Queue)。在循环队列中进行出。在循环队列中进行出队、入队操作时,头尾指针仍要加队、入队操作时,头尾指针仍要加1,朝前移动。只不过当头尾指针指向向量朝前移动。只不过当头尾指针指向向量上界(上界(QueueSize-1)时,其加)时,其加1操作的操作的结果是指向向量的下界结果是指向向量的下界0。数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖 显然,因为循环队列元素的空间可显然,因为循环队列元素的空
10、间可以被利用,除非向量空间真的被队列以被利用,除非向量空间真的被队列元素全部占用,否则不会上溢。因此元素全部占用,否则不会上溢。因此,除一些简单的应用外,真正实用的,除一些简单的应用外,真正实用的顺序队列是顺序队列是循环队列。循环队列。 数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖012345rearfrontJ5J6J7012345rearfrontJ4J9J8J4J5J6012345rearfront初始状态初始状态J4,J5,J6出队出队J7,J8,J9入队入队队空:队空:front=rear队满:队满:front=rear解决方案:解决方案:1.另外另外设一个标志设
11、一个标志以区别队空、队满以区别队空、队满2.少用一个元素空间少用一个元素空间: 队空:队空:front=rear 队满:队满:(rear+1)%M=front数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖 由于入队时尾指针向前追赶头指针,出由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满队时头指针向前追赶尾指针,故队空和队满时头尾指针均相等。因此,我们无法通过时头尾指针均相等。因此,我们无法通过Q.front=Q.rear来判断队列来判断队列“空空”还是还是“满满”。 解决此问题的方法至少有两种:解决此问题的方法至少有两种: 其一是另设一个布尔变量以区
12、别队列的空其一是另设一个布尔变量以区别队列的空和满;其二是少用一个元素的空间,约定入和满;其二是少用一个元素的空间,约定入队前,测试尾指针在循环意义下加队前,测试尾指针在循环意义下加1后是否后是否等于头指针,若相等则认为队满(注意:等于头指针,若相等则认为队满(注意:rear所指的单元始终为空)所指的单元始终为空)数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖队空:队空:Q.front =Q. rear队满:队满: Q.front =(Q.rear + 1) % maxSize入队入队: Q.rear = (Q.rear + 1) % maxSize出队出队: Q.front
13、 = (front + 1) % maxSize;求队长求队长:(Q.rear-Q.front+maxSize)%maxSize循环队列循环队列数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖 2) 进队列实现程序进队列实现程序Status EnQueue (SqQueue &Q, ElemType e) if (Q.rear+1)%MAXQSIZE = Q.front) return(ERROR); Q.dataQ.rear=e; Q.rear=(Q.rear+1)%MAXQSIZE; return(OK); 循环队列的基本运算实现循环队列的基本运算实现 1、进队列、进队列
14、1)进队列算法)进队列算法(1)检查队列是否已满,若队满,则进行溢出错误处理)检查队列是否已满,若队满,则进行溢出错误处理(2)将新元素赋给队尾指针所指单元;)将新元素赋给队尾指针所指单元;(3)将队尾指针后移一个位置(即加)将队尾指针后移一个位置(即加1),指向下一单元。),指向下一单元。数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖2) 出队列实现程序出队列实现程序Status DeQueue (SqQueue &Q, ElemType &e) if (Q.rear= Q.front) return(ERROR); e=Q.dataQ.front; Q.front=(Q.
15、front+1)%MAXQSIZE; return(OK); 2. 出队列出队列1)出队列算法出队列算法(1)检查队列是否为空,若队空,则进行下溢错误处理;)检查队列是否为空,若队空,则进行下溢错误处理;(2)取队首元素的值。)取队首元素的值。(3)将队首指针后移一个位置(即加)将队首指针后移一个位置(即加1););数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖(4) 取队头元素取队头元素ElemType GetHead(SqQueue Q ) if (Q.front= =Q.rear) return(ERROR); return (Q.dataQ.front);(5) 判队
16、列空否判队列空否 int QueueEmpty(SqQueue Q ) if (Q.front= =Q.rear) reurn (1);else return (0); (3) 队列初始化队列初始化 Q.front=Q.rear=0;数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖3.4.3 3.4.3 链队列链队列 队列的链式存储结构简称为链队列,它是限队列的链式存储结构简称为链队列,它是限制仅在表头删除和表尾插入的单链表。显然仅有制仅在表头删除和表尾插入的单链表。显然仅有单链表的头指针不便于在表尾做插入操作,为此单链表的头指针不便于在表尾做插入操作,为此再增加一个尾指针,指
17、向链表的最后一个结点。再增加一个尾指针,指向链表的最后一个结点。于是,一个链队列由头指针和尾指针唯一确定。于是,一个链队列由头指针和尾指针唯一确定。数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖null*qq.frontq.rear非空队列非空队列q.frontq.rearnull空队列空队列*q 链队列示意图链队列示意图数数 据据 结结 构构 武汉大学测绘学院虞晖武汉大学测绘学院虞晖 和顺序队列类似,我们也是将这两个指针封和顺序队列类似,我们也是将这两个指针封装在一起,将链队列的类型装在一起,将链队列的类型LinkQueueLinkQueue定义为一定义为一个结构类型:个结
展开阅读全文