C语言数据结构之栈与队列的应用(3)

循环队列的应用——舞伴配对问题:在舞会上,男、女各自排成一队。舞会开始时,依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。假设初始男、女人数及性别已经固定,舞会的轮数从键盘输入。试模拟解决上述舞伴配对问题。要求:从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名。

//舞伴配对问题
#define MAXSIZE 10
typedef struct
{
	int *base;
	int front,rear;
}Man;
typedef struct
{
	char *base;
	int front,rear;
}Woman;

void ManQueue(Man &Q,int m)//建立一个男人队列
{
	Q.base =(int *)malloc(sizeof(int)*MAXSIZE);
	if(!Q.base )return;
	Q.front =Q.rear =0;
	
	for(int i=0;i<m;i++)
	{
		printf("输入第%d个男人名:",i+1);
		scanf("%d",&Q.base[Q.rear]);
		Q.rear =(Q.rear +1)% MAXSIZE;
	}
	printf("输出男人队列:");
	for(i=0;i<m;i++)
		printf("%d   ",Q.base[i]);
	printf("\n");
}

void WomanQueue(Woman &Q,int n)//建立一个女人队列
{
	Q.base =(char *)malloc(sizeof(char)*MAXSIZE);
	if(!Q.base )return;
	Q.front =Q.rear =0;
	getchar();
	for(int i=0;i<n;i++)
	{
		printf("输入第%d个女人名:",i+1);
		scanf("%c",&Q.base[Q.rear]);
		Q.rear =(Q.rear +1)% MAXSIZE;
		getchar();
	}
	printf("输出女人队列:");
	for(i=0;i<n;i++)
		printf("%c   ",Q.base[i]);
	printf("\n");
}

void peidui(Man Q1,Woman Q2,int m,int n,int k)//配对——k表示第几轮
{
	int min,Mname;
	char Wname;
	if(m>n) min=n;else min=m;
	for(int i=1;i<=k;i++)//第几轮
	{
		for(int j=0;j<min;j++)
		{
			Mname=Q1.base[Q1.front];
			Wname=Q2.base[Q2.front];
			Q1.front=(Q1.front+1)%MAXSIZE;
			Q2.front=(Q2.front+1)%MAXSIZE;
			printf("配对者:%d--%c\n",Mname,Wname);
			Q1.base [Q1.rear] =Mname;
			Q1.rear =(Q1.rear +1)%MAXSIZE;
			Q2.base [Q2.rear] =Wname;
			Q2.rear =(Q2.rear +1)%MAXSIZE;
		}
		if(m>n)//男人多
		{
			printf("未配对的第一个出来的是:%d\n",Q1.base[Q1.front]);
		}
		else//女人多
		{
			printf("未配对的第一个出来的是:%c\n",Q2.base[Q2.front]);
		}
	}
}
void main()
{
	Man Q1;
	Woman Q2;
	ManQueue(Q1,4);
	WomanQueue(Q2,6);
	peidui(Q1,Q2,4,6,3);   
 }

    原文作者:舞伴问题
    原文地址: https://blog.csdn.net/qq_26816591/article/details/49585117
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞