数据结构(舞伴问题)——队列问题解决
舞伴问题:假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。
分析
-
先入队的女士和男士先出队配成舞伴
-
首先要实现用队列来存放男女跳舞人员
-
初始化两个队列(男队和女队)
//--------跳舞者个人信息----------
typedef struct
{
char name[20]; //姓名,字符串类型
char sex; //性别,'F'表示女性,'M'表示男性
}Person;
//--------队列的顺序储存结构------------
typedef struct
{
Person *base; //队列中数据类型元素为Person
int front; //头指针值
int rear; //尾指针值
}SqQueue;
SqQueue Mdancers,Fdancers; //分别存放男士和女士入队者队列
const int MAXSIZE=100; //队列可能达到的最大长度,这里用#define都行,个人习惯
具体算法步骤:
-
假设男士和女士的记录存在一个数组中作为输入
-
构造完成后,根据遍历分别进队
-
当有一队为空时,输出另一队第一人的名字
-
遍历男队和女队同时出队配对
注:
代码大部分为自己编撰,肯定会有很多小问题,望大佬指点;
#include"bits/stdc++.h" //#include"iostream"也行
using namespace std;
typedef char ElemType;
typedef int Status;
const int MAXSIZE=100; /*
const int OK=1; 这里是给函数返回值类型定义
const int ERROR=0; */
typedef struct
{
char name[MAXSIZE];
char sex;
}Person;
typedef struct
{
Person *base;
int front;
int rear;
}SqQueue;
Status InitQueue(SqQueue &Q) //队列初始化
{
Q.base=new Person[MAXSIZE];
if(!Q.base) return ERROR;
Q.front=Q.rear=0;
return OK;
}
Status EnQueue(SqQueue &Q,Person e) //e元素入队列Q
{
if((Q.rear+1)%MAXSIZE==Q.front) return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;
return OK;
}
Status DeQueue(SqQueue &Q,Person &e) //将队列最前面的元素赋给e并出队
{
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return OK;
}
Status QueueEmpty(SqQueue &Q) //判断队是否为空
{
if(Q.front==Q.rear) return OK;
else return ERROR;
}
Person GetHead(SqQueue Q) //取队头元素
{
if(Q.front!=Q.rear)
return Q.base[Q.front];
}
void DancePratner(Person dancer[],int num)
//结构数组dancer中存放跳舞的男女,num为跳舞的人数
{
SqQueue Mdancers; //男队初始化
SqQueue Fdancers; //女队初始化
Person p;
InitQueue(Mdancers);
InitQueue(Fdancers);
for(int i=0;i<num;i++) //依次将跳舞队根据其性别入队
{
p=dancer[i];
if(p.sex=='F')
EnQueue(Fdancers,p); //插入女队
else EnQueue(Mdancers,p); //插入男队
}
cout<<"The dancing partners are:\n";
while(!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers))
{//依次输出男女舞伴的姓名
DeQueue(Fdancers,p); //女士出队
cout<<p.name<<","; //输出出队女士姓名
DeQueue(Mdancers,p); //男士出队
cout<<p.name<<endl; //输出出队男士姓名
}
if(!QueueEmpty(Fdancers)) //判断女士队列是否为空
{
p=GetHead(Fdancers); //取女士队头元素
cout<<"The first woman to get 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()
{
SqQueue Mdancers,Fdancers;
Person dancer[MAXSIZE];
int num;
cout<<"请输入参加舞会的人数:"<<endl;
cin>>num;
cout<<"请输入参加舞会人员信息"<<endl;
for(int i=0;i<num;i++) //建立参加舞会人员数组
{
cout<<"请输入"<<i+1<<"个人员信息:";
cin>>dancer[i].name>>dancer[i].sex; //分别将男女插入数组中
}
DancePratner(dancer,num); //男女舞伴配对
return 0;
}
小结:
舞伴问题很好的考察数据结构的问题,但并未考察到循环队列,此题是简化版的,完全可以让男女舞伴循环配对;