(精品)【10】Chapter6队列-循环队列 (2).ppt
《(精品)【10】Chapter6队列-循环队列 (2).ppt》由会员分享,可在线阅读,更多相关《(精品)【10】Chapter6队列-循环队列 (2).ppt(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构与算法数据结构与算法20092009年秋季年秋季年秋季年秋季授课教师:张剑波授课教师:张剑波授课教师:张剑波授课教师:张剑波 方方方方 芳芳芳芳授课班级:授课班级:授课班级:授课班级:111081-4111081-4班班班班 115081-2115081-2班班班班Chapter6 Chapter6 队列(队列(QueueQueue)本章教学内容本章教学内容v 6.1 6.1 队列结构特性队列结构特性队列结构特性队列结构特性v 6.2 6.2 抽象数据类型抽象数据类型抽象数据类型抽象数据类型v 6.3 6.3 公式化描述(顺序队列)公式化描述(顺序队列)公式化描述(顺序队列)公式化描述
2、(顺序队列)v 6.4 6.4 链表描述(链队列)链表描述(链队列)链表描述(链队列)链表描述(链队列)v 6.5 6.5 应用应用应用应用 1.1.火车车厢重排火车车厢重排火车车厢重排火车车厢重排6.1 队列结构特性队列结构特性2 2、几个相关的概念、几个相关的概念、几个相关的概念、几个相关的概念1 1、定义、定义、定义、定义 队列是一种特殊的线性表,是一种只允许在表的队列是一种特殊的线性表,是一种只允许在表的队列是一种特殊的线性表,是一种只允许在表的队列是一种特殊的线性表,是一种只允许在表的一端进一端进一端进一端进行插入行插入行插入行插入操作,而在操作,而在操作,而在操作,而在另一端进行删
3、除另一端进行删除另一端进行删除另一端进行删除操作的线性表。操作的线性表。操作的线性表。操作的线性表。a a1 1 a a2 2 a a3 3 a an n入队列入队列入队列入队列出队列出队列出队列出队列队头(队头(队头(队头(frontfront)队尾(队尾(队尾(队尾(rearrear)3 3、重要特征、重要特征、重要特征、重要特征 每次每次每次每次进队列进队列进队列进队列的元素都放在原队列的元素都放在原队列的元素都放在原队列的元素都放在原队列队尾队尾队尾队尾之后而成为新的队尾之后而成为新的队尾之后而成为新的队尾之后而成为新的队尾元素;元素;元素;元素;每次每次每次每次出队列出队列出队列出队
4、列的数据元素都是的数据元素都是的数据元素都是的数据元素都是原队头元素原队头元素原队头元素原队头元素;先入队列的元素先出队列,后入队列的元素后出队列。先入队列的元素先出队列,后入队列的元素后出队列。先入队列的元素先出队列,后入队列的元素后出队列。先入队列的元素先出队列,后入队列的元素后出队列。队列是一个队列是一个队列是一个队列是一个先进先出先进先出先进先出先进先出的线性表(的线性表(的线性表(的线性表(First In First OutFirst In First Out,FIFOFIFO)。)。)。)。如:(如:(如:(如:(1 1)日常生活中的排队;)日常生活中的排队;)日常生活中的排队;
5、)日常生活中的排队;(2 2)操作系统中的作业队列。)操作系统中的作业队列。)操作系统中的作业队列。)操作系统中的作业队列。C C课堂练习课堂练习u3 3、设设设设栈栈栈栈S S和和和和队队队队列列列列QQ的的的的初初初初始始始始状状状状态态态态为为为为空空空空,元元元元素素素素e1e1,e2e2,e3e3,e4e4,e5e5和和和和e6e6依依依依次次次次通通通通过过过过栈栈栈栈S S,一一一一个个个个元元元元素素素素出出出出栈栈栈栈后后后后即即即即进进进进队队队队列列列列QQ,若若若若6 6个个个个元元元元素素素素出出出出队队队队的的的的序序序序列列列列是是是是e2e2,e4e4,e3e3
6、,e6e6,e5e5,e1e1,则栈,则栈,则栈,则栈S S的容量至少应该是的容量至少应该是的容量至少应该是的容量至少应该是 。A A、6 B6 B、5 C5 C、3 D3 D、2 26.2 队列的抽象数据类型描述队列的抽象数据类型描述ADT QueueADT Queue 实例实例实例实例 有序线性表,一端称为有序线性表,一端称为有序线性表,一端称为有序线性表,一端称为frontfront,一端称为,一端称为,一端称为,一端称为rearrear操作操作操作操作 Create();Create();/创建一个空的队列创建一个空的队列创建一个空的队列创建一个空的队列 IsEmptyIsEmpty(
7、);();/如果队列为空,返回如果队列为空,返回如果队列为空,返回如果队列为空,返回true,true,否则返回否则返回否则返回否则返回falsefalse IsFullIsFull();();/如果队列满,返回如果队列满,返回如果队列满,返回如果队列满,返回true,true,否则返回否则返回否则返回否则返回falsefalse First();First();/返回队列中的第一个元素返回队列中的第一个元素返回队列中的第一个元素返回队列中的第一个元素 Last();Last();/返回队列中的最后一个元素返回队列中的最后一个元素返回队列中的最后一个元素返回队列中的最后一个元素 Add(xAd
8、d(x););/向队列添加元素向队列添加元素向队列添加元素向队列添加元素x x Delete(xDelete(x););/删除队首元素,并将它传递给删除队首元素,并将它传递给删除队首元素,并将它传递给删除队首元素,并将它传递给x x 队列的两种描述形式队列的两种描述形式vv队列的物理存储可以用:队列的物理存储可以用:队列的物理存储可以用:队列的物理存储可以用:顺序顺序顺序顺序存储结构存储结构存储结构存储结构 链式链式链式链式存储结构存储结构存储结构存储结构 a a1 1,a a2 2,a a3 3,a an n出出出出队列队列队列队列入队列入队列入队列入队列队队队队头头头头队队队队尾尾尾尾da
9、ta linkdata linkfrontfrontrearrear 队列的顺序存储结构,简称队列的顺序存储结构,简称队列的顺序存储结构,简称队列的顺序存储结构,简称顺序队列顺序队列顺序队列顺序队列;顺序队列可用一个一维数组顺序队列可用一个一维数组顺序队列可用一个一维数组顺序队列可用一个一维数组queueMaxSizequeueMaxSize 来存储,其中来存储,其中来存储,其中来存储,其中MaxSizeMaxSize是队列能存放的最大元素个数;是队列能存放的最大元素个数;是队列能存放的最大元素个数;是队列能存放的最大元素个数;为了指示队头和队尾,需要设立一个队头指示器和一个队为了指示队头和队
10、尾,需要设立一个队头指示器和一个队为了指示队头和队尾,需要设立一个队头指示器和一个队为了指示队头和队尾,需要设立一个队头指示器和一个队尾指示器,或称队头指针、队尾指针,为了算法设计上的方便,尾指示器,或称队头指针、队尾指针,为了算法设计上的方便,尾指示器,或称队头指针、队尾指针,为了算法设计上的方便,尾指示器,或称队头指针、队尾指针,为了算法设计上的方便,约定:约定:约定:约定:n n frontfront(头指针):指向实际(头指针):指向实际(头指针):指向实际(头指针):指向实际队头元素的前一个位置队头元素的前一个位置队头元素的前一个位置队头元素的前一个位置;n n rearrear(尾
11、指针):指向实际(尾指针):指向实际(尾指针):指向实际(尾指针):指向实际队尾元素队尾元素队尾元素队尾元素所在的位置。所在的位置。所在的位置。所在的位置。6.3 队列的公式化描述(顺序存储结构)队列的公式化描述(顺序存储结构)(1 1)初始化初始化初始化初始化(2 2)入队列(插入)入队列(插入)入队列(插入)入队列(插入)建立一个空队列,即队头指针建立一个空队列,即队头指针建立一个空队列,即队头指针建立一个空队列,即队头指针front=-1front=-1,队尾指针,队尾指针,队尾指针,队尾指针rear=-1rear=-1。当队满时(队满条件:当队满时(队满条件:当队满时(队满条件:当队满
12、时(队满条件:rear=MaxSize-1rear=MaxSize-1),产生溢出;),产生溢出;),产生溢出;),产生溢出;当队不满时,尾指针加当队不满时,尾指针加当队不满时,尾指针加当队不满时,尾指针加1 1(rear=rear+1rear=rear+1),然后把待,然后把待,然后把待,然后把待插元素插元素插元素插元素x x送入尾指针所指数组分量。送入尾指针所指数组分量。送入尾指针所指数组分量。送入尾指针所指数组分量。1、顺序队列的基本操作、顺序队列的基本操作(3 3)出队列(删除)出队列(删除)出队列(删除)出队列(删除)当队不空时(队空条件:当队不空时(队空条件:当队不空时(队空条件:
13、当队不空时(队空条件:front=rearfront=rear),队头指针加),队头指针加),队头指针加),队头指针加1 1(front=front=frontfront+1+1),返回原队头元素,即头指针所指数组,返回原队头元素,即头指针所指数组,返回原队头元素,即头指针所指数组,返回原队头元素,即头指针所指数组分量的值。分量的值。分量的值。分量的值。4 43 32 21 10 04 43 32 2C C1 1B B0 0A A4 43 32 21 10 04 4E E3 3D D2 21 10 0frontfront=rear=rear=-1=-1frontfront=-1=-1队列空队列
14、空队列空队列空A A,B B,C C入队列入队列入队列入队列D D,E E入队列入队列入队列入队列rearrear=2=2rearrear=front=front=2=2A A,B B,C C出队列出队列出队列出队列队队队队 空空空空frontfront=2=2rearrear=4=42、“假溢出假溢出”问题问题 【方法一方法一方法一方法一】按最大可能的进队列操作次数按最大可能的进队列操作次数按最大可能的进队列操作次数按最大可能的进队列操作次数,设置顺序队列,设置顺序队列,设置顺序队列,设置顺序队列的最大元素个数,这种方法很浪费空间,而且有时会因为估的最大元素个数,这种方法很浪费空间,而且有时
15、会因为估的最大元素个数,这种方法很浪费空间,而且有时会因为估的最大元素个数,这种方法很浪费空间,而且有时会因为估计不准而出错;计不准而出错;计不准而出错;计不准而出错;【方法二方法二方法二方法二】修改出队列算法修改出队列算法修改出队列算法修改出队列算法,设每次出队列后,都把队列,设每次出队列后,都把队列,设每次出队列后,都把队列,设每次出队列后,都把队列中剩余数据元素向队头方向移用一个位置,时间复杂度为中剩余数据元素向队头方向移用一个位置,时间复杂度为中剩余数据元素向队头方向移用一个位置,时间复杂度为中剩余数据元素向队头方向移用一个位置,时间复杂度为O(nO(n),浪费了时间。,浪费了时间。,
16、浪费了时间。,浪费了时间。【方法三方法三方法三方法三】修改入队列算法修改入队列算法修改入队列算法修改入队列算法,当为真溢出时,返回,当为真溢出时,返回,当为真溢出时,返回,当为真溢出时,返回falsefalse;当;当;当;当为假溢出时,则把队列中的数据元素向队头方向移动为假溢出时,则把队列中的数据元素向队头方向移动为假溢出时,则把队列中的数据元素向队头方向移动为假溢出时,则把队列中的数据元素向队头方向移动front+1front+1个个个个位置,使队头元素位于队列的最前端后再完成新数据元素的入位置,使队头元素位于队列的最前端后再完成新数据元素的入位置,使队头元素位于队列的最前端后再完成新数据
17、元素的入位置,使队头元素位于队列的最前端后再完成新数据元素的入队操作;当为其它情况时,进队列操作算法同前。此算法的时队操作;当为其它情况时,进队列操作算法同前。此算法的时队操作;当为其它情况时,进队列操作算法同前。此算法的时队操作;当为其它情况时,进队列操作算法同前。此算法的时间复杂度也为间复杂度也为间复杂度也为间复杂度也为O(nO(n)。解决解决“假溢出假溢出”的方法的方法 【方法四方法四方法四方法四】将数组的存储区将数组的存储区将数组的存储区将数组的存储区0 0MaxSize-1MaxSize-1看成是一个看成是一个看成是一个看成是一个首尾相接的环形区域首尾相接的环形区域首尾相接的环形区域
18、首尾相接的环形区域 location(i)=(location(1)+i-1)%location(i)=(location(1)+i-1)%MaxSizeMaxSize;3、循环队列、循环队列循环队列的特点循环队列的特点循环队列头、尾指针的特点循环队列头、尾指针的特点循环队列头、尾指针的特点循环队列头、尾指针的特点:头指针头指针头指针头指针frontfront:队列中:队列中:队列中:队列中第一个第一个第一个第一个元素的下一个位置元素的下一个位置元素的下一个位置元素的下一个位置(逆时针方(逆时针方(逆时针方(逆时针方向);向);向);向);尾指针尾指针尾指针尾指针rearrear:指向队列中:
19、指向队列中:指向队列中:指向队列中最最最最后一个元素后一个元素后一个元素后一个元素。rearrearfrontfront1 10 0J J3 3J J2 2J J1 1MaxSizeMaxSize-1-1初始化:初始化:初始化:初始化:front=rear=0;front=rear=0;(1 1)插入或删除一个元素的实现)插入或删除一个元素的实现)插入或删除一个元素的实现)插入或删除一个元素的实现n n 插入插入插入插入:在队尾进行,:在队尾进行,:在队尾进行,:在队尾进行,尾指针向顺时针方向移动一个位置尾指针向顺时针方向移动一个位置尾指针向顺时针方向移动一个位置尾指针向顺时针方向移动一个位置
20、动态描述:动态描述:动态描述:动态描述:rear=rear+1;rear=rear+1;if(rearif(rear=MaxSize-1)=MaxSize-1)rear=0;rear=0;可利用数学上的可利用数学上的可利用数学上的可利用数学上的“模()运算模()运算模()运算模()运算”来实现上述过程:来实现上述过程:来实现上述过程:来实现上述过程:rear=(rear+1)%MaxSize;rear=(rear+1)%MaxSize;4、循环队列的操作、循环队列的操作rearrearfrontfront1 10 0J J3 3J J2 2J J1 1MaxSizeMaxSize-1-1n n
21、 删除删除删除删除:在队头进行,头指针向顺时针:在队头进行,头指针向顺时针:在队头进行,头指针向顺时针:在队头进行,头指针向顺时针方向移动一个位置方向移动一个位置方向移动一个位置方向移动一个位置front=(front+1)%MaxSize;front=(front+1)%MaxSize;(3 3)入队列、出队列如何判断队满、队空)入队列、出队列如何判断队满、队空)入队列、出队列如何判断队满、队空)入队列、出队列如何判断队满、队空 采用循环队列,不易区别队空和队满,都为采用循环队列,不易区别队空和队满,都为采用循环队列,不易区别队空和队满,都为采用循环队列,不易区别队空和队满,都为 front
22、=rear;front=rear;此条件用来判断此条件用来判断此条件用来判断此条件用来判断队空队空队空队空。rearrearfrontfront1 10 0J J3 3J J2 2J J1 1MaxSizeMaxSize-1-1n n 队满队满队满队满的判断:的判断:的判断:的判断:把把把把“尾指针加尾指针加尾指针加尾指针加1 1后等于头指针后等于头指针后等于头指针后等于头指针”作为队列满的条件。作为队列满的条件。作为队列满的条件。作为队列满的条件。(rear+1)%MaxSize=front (rear+1)%MaxSize=front 用以上方法判队空、队满时,队列中因留有一个空额而损用以
23、上方法判队空、队满时,队列中因留有一个空额而损用以上方法判队空、队满时,队列中因留有一个空额而损用以上方法判队空、队满时,队列中因留有一个空额而损失了一个空间,所以还可以用另一种方法:失了一个空间,所以还可以用另一种方法:失了一个空间,所以还可以用另一种方法:失了一个空间,所以还可以用另一种方法:设立标志位设立标志位设立标志位设立标志位来区别来区别来区别来区别队空、队满,例如:队空、队满,例如:队空、队满,例如:队空、队满,例如:boolbool IsFullIsFull;循环队列类循环队列类Queue(程序(程序6-1)template class Queue template class
24、Queue public:public:Queue(Queue(intint MaxQueueSizeMaxQueueSize=10);=10);Queue()Queue()delete queue;delete queue;boolbool IsEmptyIsEmpty()const return front=rear;()const return front=rear;boolbool IsFullIsFull()const()const return(rear+1)%MaxSize=front)?1:0;return(rear+1)%MaxSize=front)?1:0;T First(
25、)const;T First()const;/返回队首元素返回队首元素返回队首元素返回队首元素T Last()const;T Last()const;/返回队尾元素返回队尾元素返回队尾元素返回队尾元素Queue&Queue&Add(constAdd(const T&x);T&x);Queue&Queue&Delete(constDelete(const T&x);T&x);private:private:intint front;front;/与第一个元素在反时针方向上相差一个位置与第一个元素在反时针方向上相差一个位置与第一个元素在反时针方向上相差一个位置与第一个元素在反时针方向上相差一个位置
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 精品【10】Chapter6队列-循环队列 2 精品 Chapter6 队列 循环
限制150内