题目
利用队列的基本操作,完成舞伴问题
舞伴问题的描述:假设在周末舞会上,男士们和女士们进入舞厅时各自排成一队,跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴,若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求设计一个函数模拟上述舞伴配对问题,试设计程序实现之
#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版》严蔚敏 李冬梅 吴伟民