信息学辅导--数据结构之五--队列.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
信息学辅导--数据结构之五--队列

五、队列 (一)、队列的概念及运算 队列的定义: 队列是一种所以队列又称为先进先出(First In First Out)表,简称FIFO表。队列的数学性质: 假设队列为a1,a2,..,an,那么a1就是队头元素,an为队尾元素。队列中的元素是按a1,a2,..,an的顺序进入的,退出队列也只能按照这个次序依次退出。也就是说,只有在a1离开队列之后,a2才能退出队列,只有在a1,a2,..,an-1都离开队列之后,an才能退出队列。图是队列的示意图。 ????????????? 图队列的运算: 为一种抽象数据类型,常用的队列运算有: 运算 含义 Get(Q) 这是一个函数,函数值返回队列Q的队头元素。 Enueue(Q,x) 将元素x插入队列Q的队尾。此运算也常简称为将元素x入队。 Dl_Queue(Q) 将Q的队头元素删除,简称为出队。 (Q) 这是一个函数,若Q是一个空队列,则函数值为,否则为。 (Q) 使队列Q成为空队列。 队列的顺序存储结构可以简称为顺序队列,也就是利用一组地址连续的存储单元依次存放队列中的数据元素。在队列的运算中需设两个指针:head:队头指针,指向实际队头元素的前一个位置,rear:队尾指针,指向实际队尾元素所在的位置。一般情况下,两个指针的初值设为0,这时队列为空,没有元素。在此我们约定:初始化队列时,空队列时令front:=0;rear:=0, 另外还约定,在非空队列中,头指针front总是指向队列中实际队头元素的前面一个位置,而尾指针rear总是指向队尾元素。 图2 ( a)画出了一个由6个元素构成的队列,数组定义Q[1..10]。Q(i) i=3,4,5,6,7,8,头指针head=2,尾指针rear=8。队列中拥有的元素个数为:L=rear-head。现要让排头的元素出队,则需将头指针加1。即head=head+1这时头指针向上移动一个位置,指向Q(3),表示Q(3)已出队。见图2 (b)。如果想让一个新元素入队,则需尾指针向上移动一个位置。即rear=rear+1这时Q(9)入队,见图2 (c)。当队尾已经处理在最上面时,即rear=10,见图2 (d),如果还要执行入队操作,则要发生上溢,但实际上队列中还有三个空位置,所以这种溢出称为假溢出。 (三)、队列基本算法的实现 1、顺序队列的定义 Const MAXSIZE= 100 var Queue: array[1..MAXSIZE] of datatype; //存放队列中数据元素的存储单元 front,rear:integer; //队头、队尾指针 (没有使用结构体类型,很多人不大习惯用结构体类型) 2、初始化队列,使队列成为空队列将元素x插入队列Q的队尾。此运算也常简称为将元素x入队。将Q的队头元素删除,简称为出队。返回队列Q的队头元素“溢出”。一种情况是队列中所有存储单元都占用了,发生溢出时称“真溢出”;另一种情形,在图2(d)中,虽然队尾指针已经指向最后一个位置,但事实上队列中还有3个空位置。也就是说,队列的存储空间并没有满,但队列却发生了溢出,我们称这种现象为“假溢出”。 为了克服“假溢出”现象,这里引入循环的概念,将数组存储区看成是一个首尾相接的环形区域。当存放到n-1地址后,下一个地址就“翻转”为0。这就好比把存储空间弯起来,形成一个头尾相接的环形,这时的队列称为循环队列。 循环队列在入队或出队时,可以利用取模运算实现队头及队尾位置的移动: Front:=(front+1) mod MAXSIZE; Rear:=(rear+1) mod MAXSIZE; 当front或rear为MAXSIZE-1时,上述两个公式计算的结果就为0,使得队首和队尾的位置自动由后面转到前面,形成循环的效果。 循环队列中,约定在非空循环队列中,头指针front总是指向队列中实际队头元素的前面一个位置,而尾指针rear总是指向队尾元素。 队空rear=front 队满循环队列的算法 循环队列的定义:循环队列实质上仍然还是顺序存储结构,只是形式上有所改变而已。2)将循环队列置为空Procedure Init_Queue; //将循环队列初始化front:=0; rear:=0; end; (3)判断循环队列是否为空 int IsNull_Queue :Boolean; begin? ?if (rear=front) int IsNull_Queue:=true ??? else int IsNull_Queue:=false; end; (4)在循环队列中插入新的元素xEnter_Queue (x:datatype); begin if ((rear+1)

文档评论(0)

shenlan118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档