数据结构队列课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构队列课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 队列 课件
- 资源描述:
-
1、第4章 队 列 第第4 4章章 队队 列列 4.1 队列的应用实例及概念队列的应用实例及概念 4.2 队列的存储方式队列的存储方式4.3 队列的有关操作队列的有关操作 4.4 队列的队列的ADT定义及类定义定义及类定义 4.5 应用实例的实现应用实例的实现 4.6 实习四:实习四:循环队列演示程序循环队列演示程序第4章 队 列 4.1 队列的应用实例及概念队列的应用实例及概念 队列限定只能在表的一端进行插入,而在表的另一端进行删除的线性表。在表中允许插入的一端叫做队尾(rear),允许删除的一端叫做队头(front),向队尾插入一个元素的操作叫做入队(enque)操作,从队头取出一个元素的操作
2、叫做出队(dlque)操作。随着入队、出队操作的执行,队列的队头、队尾也不断地随之改变。由于队列的操作具有“先进先出”的特点,因此队列又称作先进先出表(FIFO,即First In First Out)。第4章 队 列 图 4.1 队列结构示意图 入队入队第4章 队 列 一般,一个队列是由n个元素组成的有限序列,可记作:Q=(a1,a2,ai,an)其中,每个ai都是队列Q的数据元素,数据元素可以是各种类型,但必须属于同一种数据元素类。从银行排队等待取款的实例中我们可以看到,队列的操作与排队、离队的动作非常相似,入队操作就相当于来了一位新的顾客在队尾排队等候的事件,而出队操作就相当于取款后离队
3、的事件。除了入队(enque)、出队(dlque)操作以外,队列的操作通常还包括初始化(init)、求当前元素个数(currentsize)、判是否为空队列(empty)、清空(clear)以及取队头元素(getfirst)等。第4章 队 列 综上所述,队列是一种数据类型,其数据元素之间呈线性关系,其操作的特点是“先进先出”,主要操作有入队、出队和取队头元素等。队列在程序设计中也经常使用。一个最典型的例子就是操作系统中的作业排队。在允许多道程序运行的计算机系统中,作业输入后通常处于后备状态,由操作系统中的作业调度程序将作业调入执行。作业调度程序可以采用不同的调度策略,其中最简单的调度策略就是“
4、先来先服务”,也就是要使用一个队列来实现这种调度策略。同样在做输出时也要按请求输出的先后次序排队。作业输出统一由操作系统中的输出程序来执行,每当输出程序传输完毕可以接收新的输出任务时,队头的输出作业从队列中退出做输出操作。凡是请求输出的作业都是从队尾进入队列的。第4章 队 列 此外,在一些算法中也经常使用队列。例如,在图的遍历的非递归算法中,要使用一个“层次队列”来存放已访问的上层元素,由此来实现对下层元素的依次访问。为了对队列及其有关操作的实现方法有比较直观的了解,我们可以作成一个循环队列的演示程序。在演示操作屏幕中设置一个绘图板显示循环队列的当前状态,即用一个环形的区域表示循环队列并显示其
5、中的当前元素,数据元素可以使用形影线来标记;设置一个组合框用于指定当前的入队元素及显示当前的出队元素;设置清空、入队、出队、退出等四个操作按钮用于进行演示操作(见实习四:循环队列演示程序)。第4章 队 列 4.2 队列的存储方式队列的存储方式 4.2.1 队列的链式存储结构队列的链式存储结构 图 4.2 链队列示意图 队头队尾frontrear第4章 队 列 图 4.3 链队列指针变化状况(a)空队列;(b)a入队列;(c)b入队列;(d)a出队列 frontrear(a)frontreara(b)frontreara(c)bfrontreara(d)b第4章 队 列 图 4.4 链队列类型结
6、构 datanext结点类型rearfront链队列类型第4章 队 列 假设结点类型名为nodetp,结点指针类型名为link,结点类型中数据域名为data,指针域名为next,数据元素的类型为elemtp,链队列的头指针和尾指针分别为front与rear,则链队列类型lquetp可定义如下:type link=nodetp nodetp=record data:elemtp;next:link;end;lquetp=record front:link;rear:link;end;第4章 队 列 在程序中使用的链队列可以用一个lquetp型变量来表示,例如:var lq1:lquetp;当lq
7、1.front=lq1.rear时,这个队列就成为空队列,否则,lq1.front.next指向队头结点,而lq1.rear指向队尾结点。和链栈的情形相同,一般不会出现队列满的情形,除非整个可用空间都被占满,new(p)都无法执行的情形下才会发生上溢。同样空队列的状态在程序设计中也被用作实现控制转移的条件。第4章 队 列 4.2.2 队列的顺序存储结构队列的顺序存储结构 图 4.5 顺序队列的存储结构 J5J4maxrearfrontelem1.max第4章 队 列 图 4.6 顺序队列中头尾指针的变化(a)空队列;(b)a、b、c、d 依次入队;(c)a、b、c 依次出队;(d)e、f入队(
8、a)frontdcba(b)rearrear1023456front1023456d(c)rear1023456fronted(d)rearf1023456front第4章 队 列 对一般的顺序队列,我们可以用front=rear作为判别队列是否为空的条件;用rearmax作为判别队列是否为满的条件。当队列非空时,可执行如下的出队操作:front:=front+1;data:=elemfront;当队列非满时,可执行如下的入队操作:rear:=rear+1;elemrear:=data;第4章 队 列 在这里值得考虑的是:当rearmax时,队列是否真正为满?假设当前队列是处在图4.6(d)的
9、状态,即max=6,rear=6,front=3,显然此时不能再做入队列的操作,因为rearmax,但队列中实际上并未存满元素,这种现象称为假溢出。当然,在发生假溢出时可以将全部元素向下移动直至头指针为0,但这样处理效率不高。一个比较巧妙的办法是将队列设想成首尾相接的环,一端放满时再从另一端存入,只要尾指针不与头指针相遇,该队列即可使用下去。这就是我们所讲的循环队列。第4章 队 列 图 4.7 循环队列示意图 01235476rearfront第4章 队 列 图 4.8 循环队列的头尾指针(a)空队列;(b)队列中有一个元素;(c)队列满 01235476frontrear(a)0123547
10、6front(b)rear01235476front(b)rear第4章 队 列 另外对于循环队列,无论是头指针还是尾指针,在对其进行加1处理时,都要考虑对结果取模。综上所述:我们可以用front=rear作为判别队列是否为空的条件;用(rear+1)mod max=front作为判别队列是否为满的条件。当队列非空时,可执行如下的出队操作:front:=(front+1)mod max;data:=elemfront;当队列非满时,可执行如下的入队操作:rear:=(rear+1)mod max;elemrear:=data;第4章 队 列 如前所述,在队列的顺序存储结构中,应该包括一个存储数
11、据元素的一维数组,取其名为elem,其长度可取为一个适当的最大值max,另外还应包括两个位置指示器front和rear,它们分别指向队头和队尾的位置,使用Pascal语言,我们可以定义以下的记录(结构)类型来表示顺序队列或循环队列,假设其类型名用squetp 表示:const max队列中允许存放元素个数的最大值;type squetp=record elem:array1.max of elemtp;front,rear:0.max end;第4章 队 列 在定义了顺序队列的类型squetp之后,我们就可以定义属于这种类型的队列,例如:var q1:squetp;此后可在程序中引用顺序队列q
12、1的相应成分,例如,q1.elemq1.rear表示队尾元素等。第4章 队 列 4.3 队列的有关操作队列的有关操作 4.3.1 循环队列的操作实现循环队列的操作实现 1.入队操作入队操作 循环队列的入队操作可表示为:function enque(var cq:squetp el:elemtp):boolean;其中,参数cq表示指定的循环队列,其类型为squetp;参数el表示入队列的元素,其类型为元素类型elemtp。该操作返回一个布尔型的函数值,表示入队操作是否执行成功。操作的功能为在循环队列cq中插入元素el。若循环队列cq不满,则插入el新的队尾元素,并返回函数值true,否则队列的
13、状态不变且返回函数值false。第4章 队 列 处理过程为判是否队列满。若队列满,则返回false,否则,队列尾指针加1,将el从队尾插入队列并返回true。程序如下:function enque(var cq:squetp,el:elemtp):boolean;begin if(cq.rear+1)mod max=cq.front then result:=false else begin cq.rear:=(cq.rear+1)mod max;cq.elemcq.rear:=el;result:=true endend;第4章 队 列 2.出队操作出队操作 循环队列的出队操作可表示为:fu
14、nction dlque(var cq:squetp):elemtp;其中,参数cq表示指定的循环队列,其类型为squetp。该操作是一个函数,其返回值表示从队列中取出的队头元素。操作的功能为:若循环队列cq非空,则从cq中取出队头元素并返回该元素,否则返回空元素NULL。处理过程为判队列是否为空队列。若队列为空队列,则返回NULL,否则,队列头指针加1并返回队头元素。第4章 队 列 程序如下:function dlque(var cq:squetp):elemtp;begin if cq.frontcq.rear then result:=NULL else begin cq.front:=
15、(cq.front+1)mod max;result:=cq.elemcq.front endend;第4章 队 列 3.其他操作其他操作初始化操作:设置循环队列cq为空的循环队列。procedure init(var cq:squetp);begin cq.front:=0;cq.rear:=0;end;第4章 队 列 求长度操作:返回循环队列cq中所含元素的个数。function size(cq:squetp):integer;begin size:=(cq.rear-cq.front+max)mod max;end;第4章 队 列 判空队列操作:若队列为空,则返回true,否则返回fal
16、se。function empty(cq:squetp):boolean;begin if cq.front=cq.rear then empty:=true else empty:=false;end;第4章 队 列 判队列满操作:若队列满,则返回true,否则返回false。function full(cq:squetp):boolean;begin if(cq.rear+1)mod max=cq.front then full:=true else full:=falseend;第4章 队 列 取队头操作:若队列非空,则返回队头元素,否则返回NULL。function getf(cq:s
17、quetp):elemtp;begin if cq.frontcq.rear then result:=NULL else result:=cq.elem(cq.front+1)mod maxend;第4章 队 列 4.3.2 链队列的操作实现链队列的操作实现 1.入队列操作入队列操作 链队列的入队操作可表示为 procedure enque(var q:lquetp el:elemtp);其中,参数q表示指定的链队列,其类型为lquetp;参数el表示入队列的元素,其类型为元素类型elemtp。操作的功能为在链队列q中插入新的队尾元素el。第4章 队 列 图 4.9 链队列入队操作示意图 f
18、rontelrear第4章 队 列 处理过程为(见图4.9):(1)生成一个元素值为el的新结点:(2)将该结点从队尾插入队列。程序如下:procedure enque(var q:lquetp,el:elemtp);var p:link;begin new(p);p.data:=el;pnext:=NIL;q.rearnext:=p;q.rear:=p;end;第4章 队 列 2 出队列操作出队列操作 链队列的出队操作可表示为 function dlque(var q:lquetp):elemtp;其中,参数q表示指定的链队列,其类型为lquetp。该操作是一个函数,其返回值表示从队列中取出
19、的队头元素。操作的功能为:若链队列q非空,则从q中取出队头元素并返回该元素,否则返回空元素NULL。第4章 队 列 图 4.10 链队列出队操作示意图 frontrear(a)front(b)frontrearrears第4章 队 列 若链队列q为空,则返回空元素NULL,否则:(1)删除队头元素,即使头结点中的指针指向队头的下一个结点。(2)若删除后成为空队列,则使头尾指针值相同。(3)取删除结点的值作为返回值,并释放该结点。第4章 队 列 程序如下:function dlque(var q:lquetp):elemtp;var s:link;el:elemtp;begin if q.fro
20、ntq.rear then result:=NULL else begin s:=q.frontnext;q.frontnext:=s.next;if s.next=nil then q.rear:=q.front;el:=s.data;dispose(s);result:=el endend;第4章 队 列 3.其他操作其他操作初始化操作:设置一个空的链队列,由q表示之。处理过程:生成一个头结点,并使q的头尾指针均指向它。procedure init(var q:lquetp);begin new(q.front);q.rear:=q.front;q.front.next:=nil;end;
21、第4章 队 列 求长度操作:返回链队列q中所含元素的个数。function size(q:lquetp):integer;var p:link;i:integer;begin p:=q.front.next;i:=0;while p nil do begin i:=i+1;p:=p.next end size:=i;end;第4章 队 列 判空队列操作:若队列为空,则返回true,否则返回false。function empty(q:lquetp):boolean;begin if q.front=q.rear then empty:=true else empty:=false;end;第4
22、章 队 列 取队头操作:若队列非空,则返回队头元素,否则返回NULL。function getf(q:lquetp):elemtp;begin if q.frontq.rear then result:=NULL else result:=q.front.next.data;end;第4章 队 列 4.4 队列的队列的ADT定义及类定义定义及类定义 4.4.1 队列的队列的ADT定义定义 与线性表、栈的情形类似,我们可以定义队列的抽象数据类型。一种数据类型的ADT定义由数据元素、结构及操作三部分组成。以下是队列的ADT定义:元素:可以是各种类型的数据,但必须同属于一个数据元素类;结构:队列中的
23、n个元素呈线性关系;第4章 队 列 (1)init(q):初始化操作。设定一个空的队列q。(2)currentsize(q):求长度函数。函数值为给定队列q中数据元素的个数。(3)empty(q):判空队列函数。若q为空队列,则返回布尔值true,否则返回布尔值false。(4)clear(q):队列清空操作。操作的结果使q成为空队列。(5)enque(q,x):入队列操作。在队列q的尾部插入元素x。若队列q不满,则元素x成为插入前队尾元素的后继,即x为新的队尾元素。操作:对队列可执行以下的基本操作:第4章 队 列 (6)dlque(q):出队列函数。若队列q非空,则删除队头元素并返回该元素,
24、且其后继为新的队头元素,否则返回函数值为空元素NULL。(7)getf(q):取队头元素函数。若队列q非空,则返回函数值为队头元素,否则返回函数值为空元素NULL。第4章 队 列 4.4.2 循环队列的类定义循环队列的类定义 在循环队列的类定义中,其数据部分应包括存储数据元素的一个一维数组,取名为elem,另外还应包括表示队头、队尾的整型变量,分别取名为front及rear。相应的操作为初始化(init),显示(prnt),入队列(enque),出队列(dlque)等等。变量elem、front及rear为类中的内部数据,要封装在这个类中,因此为私有变量,外界的程序不能访问这个变量,但在这个类
25、定义之内,所有的过程或函数都能访问它,也正因为这样,在类中定义的过程或函数的参数中,不必指定所要操作的循环队列。类中所定义的操作是该类向外界提供的接口,因此被定义成公用型。类型elemtp是表示循环队列中的元素类型,在应用程序中,它再与另一种具体的类型相对应。例如,在演示程序中,数据元素的类型elemtp与字符类型相对应。第4章 队 列 循环队列的类Txhdl可定义如下:const max队列中允许存放元素个数的最大值;type elemtp=char;Txhdl=class private elem:array1.max of elemtp;front,rear:0.max public p
展开阅读全文