ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:78.32KB ,
资源ID:8165017      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8165017.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(链式队列输入.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

链式队列输入.docx

1、链式队列输入链式队列输入 队列的基本操作及应用 【教学目的】(1)掌握队列的定义及队列的存储结构(顺序存储、链式存储);(2)掌握队列的基本操作运算:建队列、插入、删除、队列空等;(3)掌握循环队列的概念及运算;(4)能够利用队列解决一些实际问题:宽度优先搜索算法【教学重点】综合运用队列结构解决实际问题。【教学过程】一、队列的定义 前面所讲的栈是一种后进先出的数据结构,而在实际问题中还经常使用一种“先进先出”(FIFOFirst In First Out)的数据结构:即插入在表一端进行,而删除在表的另一端进行,我们将这种数据结构称为队或队列,把允许插入的一端叫队尾(rear),把允许删除的一端

2、叫队头(front)。如图 1所示是一个有 5 个元素的队列。入队的顺序依次为 a1、a2、a3、a4、a5,出队时的顺序将依然是 a1、a2、a3、a4、a5。显然,队列也是一种运算受限制的线性表,所以又叫先进先出表。在日常生活中队列的例子很多,如排队买东西,排头的买完后走掉,新来的排在队尾。二、基本术语(1)队空:当队列中没有元素时称为空队列;(2)队满:当队列中单元全部被占用;(3)进队:向队列中插入新元素;(4)出队:从队列中删除元素;(5)(假)溢出:队尾指针指向最后一个位置,但队头前面仍有空闲的单元可被利用。三、队列操作示意图 front=rear=1 front=1 rear=2

3、 front=5 rear=8 front=5 rear=9(a)空队 (b)有 3个元素(c)一般情况(d)假溢出现象 四、队列的存储结构 与线性表、栈类似,队列也有顺序存储和链式存储两种存储方法。1顺序存储 顺序存储的队列称为顺序队列。因为队列的队头和队尾都是活动的,因此,除了队列的数据区外还有队头、队尾两个指针。顺序队列的类型定义如下:type queue=record data:array0.maxsize-1 of elemtype front,rear:integer;end;front 指向队列中第一个元素的前一个单元;rear指向队列中最后一个元素的单元。2链式存储 链式存储的

4、队列称为链队。和链栈类似,用单链表来实现链队,根据队的 FIFO原则,为了操作上的方便,我们分别需要一个头指针和尾指针,如图 2 所示。五、队列的基本运算 (1)初始化:设定 Q为一空队列:procedure iniqueue(var Q:queue);begin Q.front:=-1;Q.rear:=-1;end;(2)判队列空:若队列 Q为空,则返回值 true,否则返回值 false:function qempty(Q:queue):Boolean;begin qempty:=(Q.front=Q.rear)end;(3)判队满:若队列满,则返回值 true,否则返回值 false:f

5、unction qfull(Q:queue):Boolean;begin Qfull:=(Q.rearmaxsize-1);end;(4)元素进队:若队列 Q不满时,把元素 X插入到队列 Q的队尾,否则返回信息“Overflow”:procedure inqueue(var Q:queue;X:elemtype);begin if qfull(Q)then writeln(Overflow)else begin Q.rear:=Q.rear+1;Q.dataQ.rear:=X;end end;(5)元素出队:若队列 Q不空,则把队头元素删除并返回值给 X,否则输出信息“Underflow”:p

6、rocedure delqueue(var Q:queue;var X:elemtype);begin if qempty(Q)then writeln(Underflow)else begin Q.front:=Q.front+1;X:=Q.dataQ.front;end;end;(6)取队头元素:若队列不空,返回队头元素的值,否则返回信息“Underflow”:function gethead(Q:queue):elemtype;begin if qempty(Q)then writeln(Underflow)else gethead:=Q.dataQ.front+1;end;六、循环队列

7、 所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用,循环队列的定义如队列。当存储空间的最后一个位置已被使用而要进行入队运算时,只要存储空间第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。采用首尾相接的循环队列结构后,可以有效地解决假溢出的问题,避免数据元素的移动。七、循环队列的基本运算 (1)初始化:设定 Q为一空队列:procedure iniqueue(var Q:queue);begin Q.front:=0;Q.rear:=0;end;(2)判队列空:若队列 Q为空,则返回值 true,否则返回值 fals

8、e:function qempty(Q:queue):Boolean;begin qempty:=(Q.front=Q.rear)end;(3)判队满:若队列满,则返回值 true,否则返回值 false:function qfull(Q:queue):Boolean;begin qfull:=(Q.rear+1)mod maxsize=Q.front);end;(4)元素进队:若队列 Q不满时,把元素 X插入到队列 Q的队尾,否则返回信息“Overflow”:procedure inqueue(var Q:queue;X:elemtype);begin if qfull(Q)then wri

9、teln(Overflow)else begin Q.rear:=(Q.rear+1)mod maxsize;Q.dataQ.rear:=X;end end;(5)元素出队:若队列 Q不空,则把队头元素删除并返回值给 X,否则输出信息“Underflow”:procedure delqueue(var Q:queue;var X:elemtype);begin if qempty(Q)then writeln(Underflow)else begin Q.front:=(Q.front+1)mod maxsize;X:=Q.dataQ.front;end;end;(6)取队头元素:若队列不空,

10、返回队头元素的值,否则返回信息“Underflow”:function gethead(Q:queue):elemtype;begin if qempty(Q)then writeln(Underflow)else gethead:=Q.data(Q.front+1)mod maxsize;end;八、队列的应用 队列在计算机科学领域中所起的作用:1、解决主机与外部设备之间速度不匹配的问题(如:主机与打印机,设置一个打印数据缓冲区);2、解决由多用户引起的资源竞争问题(如:CPU 资源的竞争,操作系统按照每个请求的先后顺序,排成一个队列)。九、典型例题 例题 1:1995年高中组基础题第 4

11、题,从入口(1)到出口(17)的可行路线图中,数字标号表示关卡:现将上面的路线图,按记录结构存储如下:请设计一种能从存储数据中求出从入口到出口经过最少关卡路径的算法。【问题分析与答案】该题是一个路径搜索问题,根据图示,从入口(1)到出口(17)可以有多种途径,其中最短的路径只有一条,那么如何找最短路径是问题的关键;根据题意,用一维数组存储各关卡号(设 NO),用另一个数组存储访问到某关卡号的前趋卡号所在数组单元下标(设 PRE);由于本题是一个典型的图的遍历问题,此题采用的是图的广度优先遍历算法,并利用队列的方式存储顶点之间的联系。即访问一个点,将其后继结点入队,并存储它的前趋结点所在单元下标

12、,直到最后从(17)点出口;从最后出口的关卡号(17)开始回访它的前趋卡号,则回返的搜索路径便是最短路径(跳过许多不必要搜索的关卡);从列表中可以看出出口关卡号(17)的被访问路径最短的是:(17)(16)(19)(18)(1)开始 根据题意,要求从存储数据中写出从入口到出口的最少关卡路径的算法是:从队列的最后一个关卡号开始,依次回访它的前驱顶点,所得到的路径即为最短路径。算法如下:i:=1;while noi17 do i:=i+1 repeat write(,noi,);write(-);i:=prei;until i=0;例题 2:有 10升油在 10 升的容器中,另有两个 7升和 3升

13、的空容器,现要求用这三个容器倒油,使得最后在 10升和 7升的容器中各有 5升油。【算法分析】提示:三个容器可以看作三个变量 C10,C7,C3,每次倒油的可能性只有如下六种情况:C10 向 C7倒油 C10向 C3倒油 C7 向 C10 倒油 C7向 C3倒油 C3向 C10 倒油 C3向 C7倒油(1)从一个容器的状态(三个容器中油的容量)看,虽然有可能经过上述六种倒油的方法产生六种容器状态,但实际上这六种新产生的容器状态,许多是已经出现过的状态。例如初始状态(10,0,0)表示 C10=10,C7=0,C3=0,经过上述六种倒油方法只能产生出两种新的容器状态(3,7,0),表示 C10

14、向 C7倒油的结果和(7,0,3),表示C10 向 C3 倒油的结果。如果再增加应该表示新容器状态是由什么状态产生的指示pre,那么用这三个容器倒油的过程就可以用队列的方法来实现了。(2)队列可以理解为一个数组,数组元素是如下记录:RECORD C10,C7,C3,pre:integer;END;数组下标为容器状态号。下面是倒油过程的队列图示:0 1 2 3 4 5 6 7 8 9 10 0 7 3 re 0 1 2 3 4 5 6 7 当倒油产生出第 19 个容器状态时已达到了题解的目的。这时只要根据 pre中的状态号 17可以回溯到第 17 个容器状态的 pre值为 15,依次可再获得 1

15、3,11,9,7,5,2,1 容器状态号,从而即可得到本题的倒油过程(共倒 9次),而且是最少的倒油次数。注意,从一个容器中向另一个容器中倒油,人操作是很直观的,对编程来说则必须考虑:1)有没有油可倒?2)究竟倒多少?可能要全部倒入另一容器,也可能只要倒一部分另一容器已经满了。队列元素说明了 100 个,是因为 10升容器最多有 010种状态,7 升容器最多有07 种状态,3 升容器最多有 03种状态,全部可能的状态为 11*8*4=352 种,但油的总量为 10,因此 352 种可能状态中大部分是不存在的。变量 fp,rp 在程序中用作队列的头指针和尾指针,flag在程序中标识是否已倒出了需

16、要的容器状态(C10=5,C7=5)例题 3:迷宫问题 下图是一个简单的迷宫 迷宫图中阴影部分是不通的路径,处于迷宫中的每个位置都可以向 8 个方向探索着按可行路径前进。假设出口位置在最右下角(6,8),入口在最左上角(1,1),试问能否设计出寻找一个从入口到出口的最短路径的算法呢?图中的(1,1)(2,2)(3,3)(3,4)(4,5)(4,6)(5,7)(6,8)便是所求的一个这种路径。【算法分析】为了设计求走迷宫的路径,首先要对迷宫进行描述,一种很自然的想法是把迷宫变为 0,1值的二维数组,对上例而言可化为:1 2 3 4 5 6 7 8 1 0 1 1 1 0 1 1 1 2 1 0

17、1 0 1 0 1 0 3 0 1 0 0 1 1 1 1 4 0 1 1 1 0 0 1 1 5 1 0 0 1 1 0 0 0 6 0 1 1 0 0 1 1 0 探索路径的选择可描述为:这样一来,迷宫中每个位置可探索的情况就分为:只有三个探索方向的位置:如(1,1);探索方向只有(1,2),(2,2)和(2,1);有五个探索方向的位置:如(3,1);探索方向有(3,2),(4,2),(4,1),(2,1),(2,2);有八个探索方向的位置:如(3,2);探索方向有(3,3),(4,3),(4,2),(4,1),(3,1),(2,1),(2,2),(2,3);能否不分情况统一按八种情况探索

18、前进的路径呢?只要把原始迷宫数据修正如下即可达到目的(外加一圈不通的围墙);0 1 2 3 4 5 6 7 8 9 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 2 1 1 0 1 0 1 0 1 0 1 3 1 0 1 0 0 1 1 1 1 1 4 1 0 1 1 1 0 0 1 1 1 5 1 1 0 0 1 1 0 0 0 1 6 1 0 1 1 0 0 1 1 0 1 7 1 1 1 1 1 1 1 1 1 1 Mg:array0.m+1,0.n+1 of integer;探索方向可用 x,y的增量组成数组:x y 1 0 1 2 1 1 3

19、 1 0 4 1-1 5 0-1 6-1-1 7-1 0 8-1 1 Zl:array1.8,1.2 of 1.1 第二个要解决的问题应当考虑探索前进路径时如何把探索的踪迹记录下来,记录的踪迹一般应包括来处和当前位置,现设计如下顺序队列来完成探索路径的踪迹:type sqtype=array1.r of record x,y:integer;当前坐标 pre:0.r;前趋位置 end;这里的 r一般=m n,即迷宫的最大空位数目 var sq:sqtype;例如:从(1,1)入口进入到达(3,3),往下探索时队列 sq 的情况:1 2 3 4 5 6 x 1 2 3 3 3 2 y 1 2 3

20、 1 4 4 pre 0 1 2 2 3 3 front rear 注意,前趋采用了仅登记前趋在队列中的序号(前趋是由 front 指针指示的数据元素);为了防止被探索过的踪迹被重复探索,被探索到的可通行路径需在迷宫中做上标记,这里采用在迷宫数据中将 0换成-1 的方法实现,这样在走出迷宫时可以再把迷宫数据还原为原来的样子。例如上例,探索到位置(3,3)的迷宫数据为:1 1 1 1 1 1 1 1 1 1 1-1 1 1 1 0 1 1 1 1 1 1-1 1-1 1 0 1 0 1 1-1 1-1-1 1 1 1 1 1 1 0 1 1 1 0 0 1 1 1 1 1 0 0 1 1 0 0

21、 0 1 1 0 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 最后根据队列 sq 中的存储信息和指针位置,即可链接成从迷宫入口到出口的最短路径。就上例而言,sq 队列的最后情况为:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 X 1 2 3 3 3 2 4 4 1 5 4 5 2 5 6 5 6 6 5 6 Y 1 2 3 1 4 4 1 5 5 2 6 6 6 3 1 7 5 4 8 8 Pre 0 1 2 2 3 3 4 5 6 7 8 8 9 10 10 11 12 14 16 16 出发 点无 fron

22、t rear 前趋 当 rear指针指示的数据元素已到达出口(6,8)时,根据 rear所据元素的前趋序号即可获得所要的走迷宫的最短路径(回溯)。如果变更增量数组中八个数据元素的顺序,队列中存储的路径就可能不相同,最后可能回溯出不同的最短路径来。例题 4:产生数(2002年 NOIP 普及组第 3 题)给出一个整数 n(n=2000)和 k个变换规则(k15)。规则:1个数字可以变换成另 1 个数字;规则中,右边的数字不能为零。例如:n=234,k=2 规则为 2 5 3 6 上面的整数 234经过变换后可能产生出的整数为(包括原数)234 534 264 564 共 4种不同的产生数 求经过

23、任意次的变换(0次或多次),能产生出多少个不同的整数。仅要求输出不同整数个数。输入:键盘输入,格式为 n k x1 y1 x2 y2 xn yn 输出:屏幕输出,格式为一个整数(满足条件的整数个数)。输入输出样例 输入:234 2 2 5 3 6 输出:4 【问题分析】本题考察了同学们三方面的能力:数的表示,如数如何表示,如何处理;转换规则如何表示;队列的应用,包括入队、出队以及队的查找。注意点:数只能以字符串的形式输入,为了计算方便,经过类型转换存入整型数组中;对数的比较也很困难,只能逐位比较,处理时用一个队列 q,开始时队列 q 中只有 n。【数据结构】str:string;输入开始的数

24、y,y1:array1.4 of 0.9;工作单元 q:array1.2000,1.30 of 0.9;队列,设长度2000 front,rear:integer;存入和取出指针 p:array1.20,1.2 of 0.9;存储变换规则,即 pi,1pi,2 【算法流程】front:=1;rear:=1;while frontnext=NULL;return(L);void InsLNode(LinkList L,ElemType x)LinkList s,p;s=(LinkList)malloc(sizeof(LNode);s-datax;p=L;while(p-next)p=p-next

25、;s-next=NULL;p-next=s;void AddPolyn(LinkList pa,LinkList pb)LinkList ha,hb,qa,qb;float sum;int a,b;ha=pa;hb=pb;qa=ha-next;qb=hb-next;while(qa&qb)a=qa-data.expn;b=qb-data.expn;if(a ha=qa;qa=qa-next;if(a=b)sum=qa-data.coef+qb-data.coef;if(sum!=0)qa-data.coef=sum;ha=qa;qa=qa-next;hb-next=qb-next;free(q

26、b);qb=hb-next;else ha-next=qa-next;free(qa);qa=ha-next;hb-next=qb-next;free(qb);qb=hb-next;if(ab)hb-next=qb-next;qb-next=ha-next;ha-next=qb;ha=qb;free(qb);qb=hb-next;if(qb)ha-next=qb;free(hb);void Invert(LinkList L)LinkList p,q,r;p=L-next;q=p-next;while(q!=NULL)r=q-next;q-next=p;p=q;q=r;L-next-next=

27、NULL;L-next=p;void Print(LinkList L)LinkList p;p=L-next;while(p-next)printf(%fx%d+,p-data.coef,p-data.expn);p=p-next;printf(%fx%d,p-data.coef,p-data.expn);void main()LinkList La,Lb;ElemType c;int a,i,b;La=InitList();Lb=InitList();printf(输入 La 的项数:);scanf(%d,&a);for(i=0;iA;I+)printf(输入 La 第%d 项系数:,i+

28、1);scanf(%f,&c.coef);printf(输入 La 第%d 项指数:,i+1);scanf(%d,&c.expn);InsLNode(La,c);printf(输入 Lb的项数:);scanf(%d,&a);for(i=0;iA;I+)printf(输入 Lb第%d项系数:,i+1);scanf(%f,&c.coef);printf(输入 Lb第%d 项指数:,i+1);scanf(%d,&c.expn);InsLNode(Lb,c);printf(La 为);printf(n);Print(La);printf(n);printf(Lb为);printf(n);Print(Lb);printf(n);printf(多项式和为);printf(n);AddPolyn(La,Lb);Invert(La);Print(La);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1