循环队列的应用——舞伴配对问题
在舞会上,男、女各自排成一队。舞会开始时,依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。假设初始男、女人数及性别已经固定,舞会的轮数从键盘输入。试模拟解决上述舞伴配对问题。要求:从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名。(分别依次输入男姓名、女姓名,并输出每轮配对结果,以下为一次标准输入输出,两队人数由主函数固定)
输入第1个男人名:a
输入第2个男人名:b
输入第3个男人名:c
输入第4个男人名:d
输出男人队列:a b c d
输入第1个女人名:A
输入第2个女人名:B
输入第3个女人名:C
输入第4个女人名:D
输入第5个女人名:E
输入第6个女人名:F
输出女人队列:A B C D E F
配对者:a–A
配对者:b–B
配对者:c–C
配对者:d–D
未配对的第一个出来的是:E
配对者:a–E
配对者:b–F
配对者:c–A
配对者:d–B
未配对的第一个出来的是:C
配对者:a–C
配对者:b–D
配对者:c–E
配对者:d–F
未配对的第一个出来的是:A
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct Queue
{
char data[MAXSIZE];
int front,rear;
}STQ;
STQ *InitQueue()
{
STQ *p = (STQ*)malloc(sizeof(STQ));
p->front = 0;
p->rear = 0;
return p;
}
void EnQueue(STQ *TQ,int t_num,char t_name)
{
if ((TQ->rear+1)%t_num == TQ->front)
{
TQ->data[TQ->rear] = t_name;
TQ->rear = (TQ->rear+1)%t_num;
return ;
}
TQ->data[TQ->rear] = t_name;
TQ->rear = (TQ->rear+1)%t_num;
}
void DeQueue(STQ *TQ,int t_num)
{
if (TQ->front == TQ->rear)
{
TQ->front = (TQ->front+1)%t_num;
return ;
}
TQ->front = (TQ->front+1)%t_num;
}
void Match(STQ *TQ1,STQ *TQ2,int num)
{
int j,i;
for (i=0;i<num;i++)
{
for (j=0;j<4;j++)
{
printf("配对者:%c--%c\n", TQ1->data[TQ1->front], TQ2->data[TQ2->front]);
char d = TQ2->data[TQ2->front];
DeQueue(TQ2,6);
EnQueue(TQ2,6,d);
char g = TQ1->data[TQ1->front];
DeQueue(TQ1,4);
EnQueue(TQ1,4,g);
}
printf("未配对的第一个出来的是:%c\n", TQ2->data[TQ2->front]);
}
}
int main()
{
STQ *Q1,*Q2;
int n;
char name1[100],name2[100];
int i;
Q1 = InitQueue(); //男
Q2 = InitQueue(); //女
printf("输入配对轮数:");
scanf("%d", &n);
getchar();
for (i=0;i<4;i++)
{
printf("输入第%d个男人名:\n", i+1);
scanf("%c", &name1[i]);
getchar();
EnQueue(Q1,4,name1[i]);
}
for (i=0;i<6;i++)
{
printf("输入第%d个女人名:\n", i+1);
scanf("%c", &name2[i]);
getchar();
EnQueue(Q2,6,name2[i]);
}
Match(Q1,Q2,n);
return 0;
}