假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。舞会开始时,依次从男队和女队的队头各处一个人配成舞伴。如果两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要写出一个算法模拟上述舞伴配对问题。
【分析】
先入队的男士或女士先出队配成舞伴。因此该问题具体有典型的“先进先出”特性,可用队列作为算法的数据结构。
在算法实现时,假设男士和女士的记录存放在一个数组中作为输入,然后扫描该数组的各元素,并根据性别来决定是进入男队还是女队。当这两队构造完成之后,依次将两队当前的队头元素出队来配成舞伴,直至某队列变空为止。此时,若某队仍有等待配对者,算法输出此队列中等待者的人数及排在队头等待者的名字,他将是下一轮舞曲开始时的第一个可获得舞伴的人。
SeqQueue.h
#pragma once
#define QueueSize 100
//typedef int DataType;
typedef struct Squeue
{
DataType queue[QueueSize];
int front, rear;
}SeqQueue;
void InitQueue(SeqQueue *SCQ)
{
SCQ->front = SCQ->rear = 0;
}
int QueueEmpty(SeqQueue SCQ)
{
if (SCQ.front==SCQ.rear)
{
return 1;
}
else
{
return 0;
}
}
int EnQueue(SeqQueue *SCQ, DataType e)
{
if (SCQ->front==(SCQ->rear+1)%QueueSize)
{
return 0;
}
SCQ->queue[SCQ->rear] = e;
SCQ->rear = (SCQ->rear + 1) % QueueSize;
return 1;
}
int DeQueue(SeqQueue *SCQ, DataType *e)
{
if (SCQ->front==SCQ->rear)
{
return 0;
}
else
{
*e = SCQ->queue[SCQ->front];
SCQ->front = (SCQ->front + 1) % QueueSize;
return 1;
}
}
int GetHead(SeqQueue SCQ, DataType *e)
{
if (SCQ.front==SCQ.rear)
{
return 0;
}
else
{
*e = SCQ.queue[SCQ.front];
return 1;
}
}
void ClearQueue(SeqQueue *SCQ)
{
SCQ->front = SCQ->rear = 0;
}
main.cpp
#include <iostream>
#include <iomanip>
using namespace std;
typedef struct
{
char name[20];
char sex;
}Person;
typedef Person DataType;
#include "SeqQueue.h"
int DancerCount(SeqQueue Q);
void DancerPartner(DataType dancer[], int num)
{
int i;
DataType p;
SeqQueue Mdancers, Fdancers;
InitQueue(&Mdancers);
InitQueue(&Fdancers);
for (i = 0; i < num;i++)
{
p = dancer[i];
if (p.sex == 'F' || p.sex == 'f')
{
EnQueue(&Fdancers, p);
}
else
{
EnQueue(&Mdancers, p);
}
}
cout << "配对成功的舞伴分别是:" << endl;
while (!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers))
{
DeQueue(&Fdancers, &p);
cout << setw(8)<<p.name;
DeQueue(&Mdancers, &p);
cout << setw(8) << p.name<<endl;
}
if (!QueueEmpty(Fdancers))
{
cout << "还有" << DancerCount(Fdancers) << "名女士等待下一首舞曲。" << endl;
GetHead(Fdancers, &p);
cout << setw(8)<< p.name << "将在下一轮中最先得到舞伴。" << endl;
}
else if (!QueueEmpty(Mdancers))
{
cout << "还有" << DancerCount(Mdancers) << "名男士等待下一首舞曲。" << endl;
GetHead(Mdancers, &p);
cout << setw(8) << p.name << " 将在下一轮中最先得到舞伴。" << endl;
}
}
int DancerCount(SeqQueue Q)
{
return ((Q.rear - Q.front + QueueSize) % QueueSize);
}
int main()
{
int i, n;
DataType dancer[30];
cout << "请输入舞池中排队的人数:" ;
scanf("%d",&n);
for (i = 0; i < n;i++)
{
cout << "姓名:";
scanf("%s", &dancer[i].name);
getchar();
cout << "性别:";
scanf("%c", &dancer[i].sex);
}
DancerPartner(dancer, n);
system("pause");
}
结果: