第13课 单行道问题——队列.docVIP

  • 16
  • 0
  • 约4.18万字
  • 约 10页
  • 2017-07-24 发布于河南
  • 举报
第13课 单行道问题——队列

第13课 单行道问题—— 队列 由于前面修路,交警叔叔把路改成了单行道,所有的车只能在入口排好一辆一辆地进入单行公路,在单行道中不能超车(因为公路的宽度只能够让一辆车通过),也不能后退(因为后面有车退不动),只有当它前面没有其他车的时候才能通过单行道出去,现在楠楠的车也在单行道中,她想知道自己是第几个开出单行道的人,你能用程序来帮她吗? 例如:用不同的字符串代表不同的车,现在有C,Bfd,G,H,Ns,DD,E,S,EG按上面的顺序进入了单行道,楠楠的车是H,刚好是第4部开出单行道的车。 【分析】 所有这些在单行道中的车可以看成是由不同字符串所组成的一个数据表,我们用数组a来表示这个数据表,其中数据元素的下标,可以代表他们进入单行道时的顺序,如上例即是:a[1]=C,a[2]=Bfd,…,a[9]=EG。 由于在单行道中的车是先进入就先出去,所以可以从数组的第一个元素开始扫描查找目标字符串,如果没有找到,就继续向下扫描。否则就输出元素下标,即是所求。 Nannan(H)C Nannan(H) C Bfd G H Ns DD E S EG 读入“楠楠“字串 读入数量到n For i:=1 to n do readln(a[i]); For i:=1 to n do readln(a[i]); N N a[i]:=nannan? a[i]:=nannan? 输出i的值 输出i的值 〖参考程序〗 Program p13_1; Var a:array[i..100] of string; i,n:integer; nannan:string; begin readln(nannan); {读入代表楠楠的车的字串} readln(n); {读入共有n辆车进入了单行道} for i:=1 to n do readln(a[i]); {读入第i辆进入单行道中的车辆字符串} i:=0; repeat {从数组第一元素开始向后逐一查找代表楠楠车的字符串} i:=i+1; until a[i]=nannan; writeln(i); end. HYPERLINK \l _top返回 及进充电 队列 在实际生活中上,我们坐公交车要排队上车,在超市买东西要排队付钱,这些就是我们常常见到的队列,它们的特点都是先到的排在前面,后到的排在后面。而在编程时,我们也用一种称为“队列”的数据组织方式来模仿日常生活中的队列。 队列的操作特点是先进先出,后进后出,所有元素从一端进入,从另一端出去,就如汽车在单行道上行走时,只能在道路的一端进入,一端出去。我们把出去的一端称为“队首(front),可以进入的一端称为“队尾”(rear),如图13-1所示: 出队列入 出队列 入队列 a1 a2 a3 … … an 队首 队尾 图13-1 队列示意图 循环队列 如果用数组a[1..n]来存储队列时,数组的上界n即是队列所容许的最大容量,如图13-2所示,当最后一个位置an已使用而还有数据要入队时,则会产生“溢出”,但前面的队首可能因元素出队而空出很多空间,这样就会白白浪费空间,而且队列又不能继续入队。 出队列入 出队列 入队列 … an 队首 队尾 图13-2 队列可以产生溢出的情形 为了解决上面问题,把前面空出来的可用空间利用起来,我们对有n个存储单元的队列,只利用前n-1个单元,而最后一个位置an用作提示指针,指向绕到第1个位置,形成逻辑上的环状空间,这样当front或rear到达整个数组的末尾时,又可以回到开头,这样的队列我们称它是循环队列。如图13-3所示: 图13-3 循环队列示意图 我们约定,如图13-3所示,队尾(rear)指示到当前队尾元素所在位置的下一位,队首(front)指示队列中第一元素在数组中的位置。 队首(front)和队尾(rear)均可以环绕数组移动,队列中腾出的空间就可以再利用,当front和rear的值大于了数组长度n时,我们就用求余运算使它们的值始终在[1..n]之间,就像时钟的指针经过了12点后总是又从1点开始一样(如17 mod 12=5). 如图1-4所示,当队列的头尾重合,即front=rear时,这时队列为空;如图13-5所示,

文档评论(0)

1亿VIP精品文档

相关文档