循环队列的应用——舞伴配对问题:在舞会上,男、女各自排成一队。舞会开始时,依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。假设初始男、女人数及性别已经固定,舞会的轮数从键盘输入。试模拟解决上述舞伴配对问题。要求:从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名。
//循环队列的常用函数
#include
#include
#define Maxsize 100
typedef struct{
int *base;
int front;
int rear;
int k; //记录初始位置
}squeue;
int a,b,i,j,n,m1,m2,m;
void Initqueue(squeue &Q)
{
Q.base=(int*)malloc(Maxsize*sizeof(int));
if (!Q.base)
exit(1);
Q.front=Q.rear=Q.k=0;
}
void Push(squeue &Q,int e)
{
if ((Q.rear+1)%Maxsize==Q.front) //队满处理
return;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%Maxsize;
}
void Pop(squeue &Q,int &e)
{
if (Q.rear==Q.front) //判空处理
return;
e=Q.base[Q.front];
Q.front=(Q.front+1)%Maxsize;
if (Q.front==Q.rear)
{
Q.front=Q.k;
}
}
void GetHead(squeue Q)
{
printf("%d\n",Q.base[Q.front]);
}
int main()
{
squeue Q,P;
Initqueue(P);
Initqueue(Q);
printf("请输入舞会轮数:\n");
scanf("%d",&n);
printf("请输入男生人数:\n");
scanf("%d",&m1);
printf("请对男生进行编号:\n");
for (i=1;i<=m1;i++)
{
scanf("%d",&P.base[i]);
Push(P,P.base[i]);
}
printf("请输入女生人数:\n");
scanf("%d",&m2);
for (i=1;i<=m2;i++)
{
scanf("%d",&Q.base[i]);
Push(Q,Q.base[i]);
}
m=m1
for (i=1;i<=n;i++)
{
printf("第%d轮舞会:\n",i);
for (j=1;j<=m;j++)
{
Pop(P,a);
Pop(Q,b);
printf("%d %d\n",a,b);
}
}
return 0;
}