- 1、本文档共56页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
队列的基本操作 结论:在队列这种数据结构中,最先插入在元素将是最先被删除;反之最后插入的元素将最后被删除,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。 队列的基本操作: (1)初始化队列 Qini (Q) (2)入队 QADD(Q,X) (3)出队 QDel(Q,X) (4)判断队列是否为空 qempty(Q) (5)判断队列是否为满qfull(Q) 解决方法:将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。采用首尾相接的结构后,形成一个环状,解决假溢出问题,避免数据元素的移动。如图所示。我们将这种形式表示的队列称之为循环队列。 1 2 3 4 m Am-1 Am Am+1 F R 空闲区 1 2 3 m-1 m am Am-1 F R Am+1 循环队列的操作 procedure iniqueue(var Q:equeue); begin Q.f:=m;Q.r:=m; end; 1、初始化:设定Q为一空队列,队首指针和队尾指针均指向存储空间的最后一个位置 2、判队列空:若队列Q为空,则返回值true,否则返回值false。 function qempty(Q:equeue):Boolean; begin qempty:=(Q.f=Q.r) end; 3、判队满:若队列满,则返回值true,否则返回值false。为了区分队列空和队列满,改用“队尾指针追上队首指针” 这一特征作为队列满标志。 function qfull(Q:equeue):Boolean; begin qfull:=((Q.r mod m)+1=Q.f); end; 4、元素进队:若队列Q不满时,把元素X插入到队列Q的队尾,否则返回信息“Overflow”: procedure add(var Q:equeue;X:elemtype); begin if qfull(Q) then writeln(‘Overflow’) else begin Q.r:=Q.r mod m+1; Q.data[Q.r]:=X; end end; 5、元素出队:若队列Q不空,则把队头元素删除并返回值给X,否则输出信息“Underflow”: procedure del(var Q:equeue;var X:elemtype); begin if qempty(Q) then writeln(‘Underflow’) else begin{后移队首指针并取出队首元素} Q.f:=Q.f mod m+1; X:=Q.data[Q.f]; end; end; 例5约瑟夫问题:编号为1,2,……n个人按顺时针方向围坐一圈,每人持一个正整数密码,开始给定一个正整数m,从第一个人按顺时针方向自1开始顺序报数,报到m者出围坐的圈子,不再参加报数,这时将出列者的密码作为m,从出列者顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人都出围坐的圈子为止,输出出列者的序列。 例如有5人 M=18 1 2 3 4 5 8 7 3 6 5 序号 密码 (1)开始取m=18,从1报数,则序号为3的人出列。 1 2 4 5 8 7 6 5 (2)开始取m=3,从4报数,则序号为1的人出列。 2 4 5 7 6 5 (3)开始取m=8,从2报数,则序号为4的人出列。 2 5 7 5 (4)开始取m=6,从5报数,则序号为2的人出列。 5 5 (5)开始取m=5,从5报数,则序号为5的人出列。 出列顺序为:3,1,4,2,5 const max=30; type people=record number,code:array[1..max] of integer end; var a:people; m,n,i,j,s,w,p:integer; begin readln(m,n); for i:=1 to n do a.number[i]:=i; for i:=1 to n do read(a.code[i]); s:=1; for j:=n downto 1 do begin s:=(s+m-1) mod j; if s=0 then s:=j; w:=s;p:=a.number[w];write(p, ); m:=a.code[p]; for i:=s to j-1 do a.number[i]:=a.num
文档评论(0)