顺序表示的队列——顺序队列3——舞伴配对问题

假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。舞会开始时,依次从男队和女队的队头各处一个人配成舞伴。如果两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要写出一个算法模拟上述舞伴配对问题。

【分析】

先入队的男士或女士先出队配成舞伴。因此该问题具体有典型的“先进先出”特性,可用队列作为算法的数据结构。

在算法实现时,假设男士和女士的记录存放在一个数组中作为输入,然后扫描该数组的各元素,并根据性别来决定是进入男队还是女队。当这两队构造完成之后,依次将两队当前的队头元素出队来配成舞伴,直至某队列变空为止。此时,若某队仍有等待配对者,算法输出此队列中等待者的人数及排在队头等待者的名字,他将是下一轮舞曲开始时的第一个可获得舞伴的人。
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 
#include 
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)<

结果:

顺序表示的队列——顺序队列3——舞伴配对问题_第1张图片

你可能感兴趣的:(数据结构与算法,顺序队列,数据结构与算法)