例一 循环队列应用举例
  编写一个打印二项式系数表(即杨辉三角)的算法。

        1 1
      1 2 1
     1 3 3 1
    1 4 6 4 1
   ……………………

  这是一个初等数学中讨论的问题。系数表中的第 k行有 k+1个数,除了第一个和最后一个数为1之外,其余的数则为上一行中位其左、右的两数之和。

  这个问题的程序可以有很多种写法,一种最直接的想法是利用两个数组,其中一个存放已经计算得到的第 k 行的值,然后输出第 k 行的值同时计算第 k+1行的值。如此写得的程序显然结构清晰,但需要两个辅助数组的空间,并且这两个数组在计算过程中需相互交换。如若引入"循环队列",则可以省略一个数组的辅助空间,而且可以利用队列的操作将一"琐碎操作"屏蔽起来,使程序结构变得清晰,容易被人理解。
 
 
  队列在程序设计中的一个典型应用例子是作业排队问题。例如,在一个局域网上有一台共享的网络打印机,网上每个用户都可以将数据发送给网络打印机进行输出。为了保证不丢失数据,操作系统为网络的打印机生成一个"作业队列",每个申请输出的"作业"应按先来后到的顺序排队,打印机从作业队列中逐个提取作业进行打印。

  在应用程序中,队列通常用以模拟排队情境,如本节中介绍的第二个应用例子,在此介绍的第一个例子则是借以说明循环队列应用的简单例子。
 
 
    如果要求计算并输出杨辉三角前 n 行的值,则队列的最大空间应为 n+2。假设队列中已存有第 k 行的计算结果,并为了计算方便,在两行之间添加一个"0"作为行界值,则在计算第 k+1 行之前,头指针正指向第 k 行的"0",而尾元素为第 k+1 行的"0"。由此从左到右依次输出第 k 行的值,并将计算所得的第 k+1 行的值插入队列的基本操作为:

算法
  do
{
   DeQueue(Q, s);  // s 为二项式系数表第 k 行中"左上方"的值
   GetHead(Q, e);  // e 为二项式系数表第 k 行中"右上方"的值
   cout<<e;    // 输出 e 的值
   EnQueue(Q, s+e); // 计算所得第 k+1 行的值入队列
  } while (e!=0);
    例如,假设n=6,当前队列中存放的是第4行的值,计算第5行的值同时输出第4行的值的过程如动画演示所示。动画

  思考题 从动画演示你已经明白了算法的核心部分,那么要写出完整的算法的话,还需要补充哪些细节呢?