运用队列设计配对问题:
#include<iostream>
#define MAXSIZE 100
#define Status int
#define OVERFLOW -1
#define OK 1
#define ERROR 0
using namespace std;
typedef struct{
char name[20];
char sex;
}Person;
typedef struct{
Person *base;
int front;
int rear;
}SqQueue;
SqQueue Mdancers,Fdancers,Adancers;
Status InitQueue(SqQueue &Q){
Q.base=new Person[MAXSIZE]; //为队列分配空间
if(!Q.base) exit(OVERFLOW); //分配失败;
Q.front=Q.rear=0; //队列为空
return OK;
}
Status QueueLength(SqQueue Q){
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
Status EnQueue(SqQueue &Q,Person e){
if((Q.rear+1)%MAXSIZE==Q.front) //尾指针在循环意义上加1后等于头指针表明队满
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;
return OK;
}
Status QueueEmpty(SqQueue Q){
if(Q.front==Q.rear) return 1;
else return 0;
}
Status DeQueue(SqQueue &Q,Person &e){
if(Q.front==Q.rear) return ERROR; //队空
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return OK;
}
Person GetHead(SqQueue Q){
if(Q.front!=Q.rear) //队头非空
return Q.base[Q.front]; //返回队头元素,队头指针不变
}
void DancePartner(SqQueue &Q){
Person p;
int i;
// for(i=0;i<num;i++){
// p=dancer[i];
while(!QueueEmpty(Adancers)){
DeQueue(Adancers,p);
if(p.sex=='F') EnQueue(Fdancers,p); //插入男队
else EnQueue(Mdancers,p); //插入女队
}
cout<<"The dancing parters are:\n";
while(!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers)){
DeQueue(Fdancers,p); //女生出队
cout<<p.name<<" "; //输出女生名
DeQueue(Mdancers,p); //男生出队
cout<<p.name<<" "; //输出男生名
}
if(!QueueEmpty(Fdancers)){ //女队非空
p=GetHead(Fdancers); //获得女队队首
cout<<"\n";
cout<<"The woman to get a partner is:"<<p.name<<endl;
}
else if(!QueueEmpty(Mdancers)){ //男队非空
p=GetHead(Mdancers);
cout<<"The first man to get a partner is :"<<p.name<<endl;
}
}
int main(){
int num;
InitQueue(Mdancers); //初始化队列 1
InitQueue(Fdancers); //初始化队列 2
InitQueue(Adancers);
Person p;
cout<<"当输入姓名为0时或者性别非F、M时停止输入!"<<endl;
for(;;){
cout<<"请输入姓名:\n";
scanf("%s",p.name);
if(p.name==0) break;
cout<<"请输入性别:\n";
getchar();
scanf("%c",&p.sex);
if(p.sex!='F'&&p.sex!='M') break;
EnQueue(Adancers,p);
cout<<"\n";
}
DancePartner(Adancers);
return 0;
}