数据结构第3章栈和队幻灯片.ppt

  1. 1、本文档共49页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
循环队列 当要反复作进队运算时,Q-rear 会达到maxsize-1,再进队就进不去了。但队的存储空间并不一定满,称这种现象为“假溢出”。为了克服假溢出(即只要队中有空余空间,就可以进队),将数组data 首尾相连,构成所谓的循环队列,同时,为使队列的运算方便,设指针Q-front所指单元为引导结点,其下一位才是当前的队头元素a0,而Q-rear 仍指向当前队列的队尾元素,其结构如图所示。 a0 an-1 maxsize-1 … Q rear j … Q front i … Q data[0] 图3.15 Q front a0 maxsize-1 0 Q rear an-1 头 循环队列的运算 1.进队、出队运算 模运算m%n(m除以n的余数),如3%5=3,7%5=2,(x+1)%x=1等等。 进队运算是在队尾插入一元素x。 先将尾指针Q-rear加1,然后x进入Q-rear所指单元,但当Q-rear已为maxsize-1时,加1后应回到0单元,故进队运算基本操作为: Q-rear=(Q-rear+1)%maxsize; Q-data[Q-rear]=x; 出队运算是返回当前队头元素。 先将队头指针Q-front加1,然后取队头; 但当Q-front已为maxsize-1时,加1后应 指向0号单元,故出队基本操作为: Q-front=(Q-front+1)%maxsize; x=Q-data[Q.front]; Q front a0 maxsize-1 0 Q rear an-1 头 X a0 头 a1 循环队列的运算 2.队空队满判定 队空判定:初始使队列为空,置Q-front=Q-rear=0即可(使两指针值相等)。随着队列反复的出队,也会出现队空。如队中只剩一个元素a0时,再出队,同样出现队头、队尾指针值相等,如图3.17所示。 Q front Q rear maxsize-1 0 Q rear Q front 图3.17 a0 头 故队空的判定条件为: Q-front==Q-rear 循环队列的运算 队满判定:出现图3.18情况时,表示队满: 若再进队就溢出了,故队满判定条件为: (Q-rear+1)%maxsize==Q-front 其中,取%运算是考虑Q-front=0、Q-rear=maxsize-1情况下的队满判定。 maxsize-1 0 Q rear Q front 图3.18 a0 an-1 a1 头 Q rear Q front maxsize-1 0 a0 an-1 a1 头 循环队列的运算 至此,我们能写出循环队列运算的几个完整算法: ClearQueue(squlink Q) //置队空// { Q-front=Q-rear=0;} int EmptyQueue(squlink Q) //判队空// { if (Q-front==Q-rear) return(1);else return(0);} int EnQueue(squlink Q,datatype x) //元素x进队// { if ((Q-rear+1)%maxsize==Q-front){ ERROR (Q); return(1);}//队满// else { Q-rear=(Q-rear+1)%maxsize; Q-data[Q-rear]=x; return(0);} } datatype DeQueue (squlink Q) // 出队 // { if ( EmptyQueue(Q)) return(NULL); // 队空// else {Q-front = (Q-front+1 )%maxsize;

文档评论(0)

开心农场 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档