利用队列的基本操作,完成舞伴问题

题目

利用队列的基本操作,完成舞伴问题

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

#include<iostream>
using namespace std;

typedef struct{
	char name[20];
	char sex; //F代表女性,M代表男性 
}Person;

#define MaxSize 100
typedef struct{
	Person *base;
	int front;
	int rear;
}Seq; //队列的顺序存储结构 


int Init(Seq &L){    //初始化
	L.base = new Person[MaxSize];
	L.front = L.rear = 0;
	return 1;
}

int Enter(Seq &L,Person m){     //入队列
	if((L.rear+1)%MaxSize == L.front){
		cout<<"队列已满!";
		return 0; 
	}
	L.base[L.rear] = m;
	L.rear = (L.rear + 1)%MaxSize;
	return 1;
}

int Out(Seq &L,Person &m){    // 出队列
	if(L.rear == L.front){
		cout<<"队列空!";
		return 0;
	}
	m = L.base[L.front];
	L.front = (L.front+1)%MaxSize;
	return 1;
}

int JudgeEmpty(Seq L){  //队列判空 
	if(L.rear == L.front){
		return 0;
	}
	return 1;
}

int GetHead(Seq L,Person &m){ //取队列头元素 
	if(L.rear == L.front){
		cout<<"队列空!";
		return 0;
	} 
	m = L.base[L.front];
} 

void DancePartner(Person *dancer,int num){
	Seq Male,Female;
	Person p1,p2;
	Init(Male);
	Init(Female);
	for(int i = 0; i < num; i++){ //男女依次入男队和女队 
		if(dancer[i].sex == 'F')Enter(Female,dancer[i]);
		else Enter(Male,dancer[i]);
	}
	cout<<"The dancing partners are:\n";
	while(JudgeEmpty(Male) && JudgeEmpty(Female)){
		Out(Female,p1);
		Out(Male,p2);
		cout<<"("<<p1.name<<","<<p2.name<<")"<<endl; 
	} 
	if(!JudgeEmpty(Male)){
		GetHead(Female,p1);
		cout<<"The first woman in next dance to get a partner is:"<<p1.name<<endl;
	}
	else if(!JudgeEmpty(Female)){
		GetHead(Male,p1);
		cout<<"The first man in next dance to get a partner is:"<<p1.name<<endl;
	}
} 

int main(){
	int num;
	Person dancer[MaxSize];
	cout<<"the number of dancers:";
	cin>>num;
	cout<<"依次输入舞者的信息(名字和性别,F代表女,M代表男)"<<endl;
	for(int i = 0; i < num; i++){
		cin>>dancer[i].name;
		cin>>dancer[i].sex; 
	}
	DancePartner(dancer,num);
	return 0;
}

参考资料:
《数据结构 C语言版 第2版》严蔚敏 李冬梅 吴伟民

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值