【数据结构】 舞伴问题: 利用循环队列模拟舞伴配对问题:在舞会上,男、女各自排成一队。舞会开始时。依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配

C的实现代码

#include<stdio.h>
#include<string.h>
#define QMAXSIZE 100 //循环队列初始大小 
typedef struct{ //定义节点存放队员的姓名和性别 
	char name[20];
	int sex;  //整形变量,0代表男性,1代表女性 
}QNode;
typedef struct{
	int front,rear; 
	int count;
	QNode dancers[QMAXSIZE] ;
}CqQueue;
void InitQueue(CqQueue *fq){ //创建空队列
    fq->front = fq->rear = NULL;
	fq->count = 0 ; 
}
int QueueEmpty(CqQueue *fq){ //判断队列是否为空 
	if(fq->front==fq->rear)
	return 1;
	return 0;
}
void EnQueue(CqQueue *fq,QNode p){ //入队列,p进入队列 
    fq->count++;
    fq->dancers[fq->rear] = p;
    fq->rear = (fq->rear+1)%QMAXSIZE;
} 
QNode DeQueue(CqQueue *fq){ //出队列,用p返回出队列的值
    QNode p;
	while(!QueueEmpty(fq)){
		p = fq->dancers[fq->front];
		fq->count--;
		fq->front = (++fq->front)%QMAXSIZE;
		return p;
	} 
}
QNode QueueFront(CqQueue *fq){ //访问队头元素 
	return fq->dancers[fq->front];
} 

int main(){
    QNode dancers[QMAXSIZE];
	int i,num;
	printf("请输入男舞和女舞的总人数:\n");
	scanf("%d",&num);
	printf("请输入姓名和性别(0代表男性,1代表女性):\n");
	for(int i=0;i<num;i++){
		scanf("%s",&dancers[i].name);
		scanf("%d",&dancers[i].sex);
		if(dancers[i].sex!=0&&dancers[i].sex!=1)
		printf("第%d个人信息错误,请重新输入 。\n",i--);
	}
	QNode p,m,w;
	CqQueue men,women;
	InitQueue(&men);InitQueue(&women); //初始化男女队列 
	for(int i=0;i<num;i++){ //队列赋值 
		p = dancers[i];
		if(p.sex==0){
			EnQueue(&men,p);
		}
		else EnQueue(&women,p);
	}
	while(!QueueEmpty(&men)&&!QueueEmpty(&women)){ //男女队列不为空时,进行男女配对 
		m = DeQueue(&men);
		printf("出队男:%s",m.name);
		w = DeQueue(&women);
		printf("\t出队女:%s",w.name);
		printf("\t配对成功。\n"); 
	}
	if(!QueueEmpty(&men)){
		m = QueueFront(&men);
		printf("男舞队列还有%d个人等待,第一个等待的队员是:%s\n",men.count,m.name); 
	}
	else if(!QueueEmpty(&women)){
		w = QueueFront(&women);
		printf("女舞队列还有%d个人等待,第一个等待的队员是:%s\n",women.count,w.name); 
	}
	else
	printf("男女舞队都无剩余队员。\n");
	return 0;
}
	

运行结果

在这里插入图片描述

发布了19 篇原创文章 · 获赞 8 · 访问量 3869

猜你喜欢

转载自blog.csdn.net/weixin_45087775/article/details/101832170