队列是限定在一端进行插人,另一端进行删除的特殊线性表。就像排队买东西,排在前面的人买完东西后离开队伍(删除),而后来的人总是排在队伍末尾(插入)。通常把队列的删除和插人分别称为出队和入队。允许出队的一端称为队头,允许入队的一端称为队尾。所有需要进队的数据项,只能从队尾进人,队列中的数据项只能从队头离去。由于总是先入队的元素先出队(先排队的人先买完东西),这种表也称为先进先出(FIFO)表。

【经典题目-周末舞会】

假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。


【输入】
第一行两队的人数,第二行舞曲的数目。

【输出】
配对情况。

【输入样例】

 第1行两队的人数
 第2行舞曲的数目 

【算法分析】
设计两个队列分别存放男士和女士。每对跳舞的人一旦跳完后就回到队尾等待下次被选。如m=4,n=3,k=6。

【参考程序】

#incdlue<cstdio>
#include<iostream>
using namespace std;
int a[10001],b[10001],k1=1,k,i,f1=1,r1,f2=1,r2;
main(){
  int m,n;
  cin>>m>>n;
  for(i=1;i<=m;i++)a[i]=i;
  for(i=1;i<=n;i++)b[i]=i;
  cin>>k;
  r1=m;r2=n;
  while(k1<=k)
  {
   print("%d %d\n",a[f1],b[f2]);
   r1++;a[r1]=a[f1];f1++;
   //第一次a[m+1]=a[1]=1,第二次a[m+2]=a[2]=2,如此循环
   r2++;b[r2]=b[f2];f2++;
   //第一次b[n+1]=b[1]=1,第二次b[n+2]=b[2]=2,如此循环
   k1++;
  }
  return 0;
}

【总结】

队列就好比排队点餐,排到最前面的就先吃饭。“先进先出”,“后进后出”。