顺序表示的队列——顺序队列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 <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");
}

结果:

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

    原文作者:舞伴问题
    原文地址: https://blog.csdn.net/baidu_36669549/article/details/84555469
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞