问题描述:
假设舞会上,男女排成一队进入舞厅时各自排成一队,开始跳舞时。依次从男队和女队的队头上各出一人配成舞伴,若两队初始人数不同,则较长的那一队中未配对者等待下一轮舞曲。编写一算法模拟配对问题。
算法分析:
根据记录创建男队和女队,男女队头依次出队直到有一个队为空,输出剩下的队的人数及队头人
代码:
- 头文件:
#pragma once
#include <stdio.h>
#include <stdlib.h>
#define QueueSize 60
//typedef int DataType;
typedef struct
{
char name[20];
char sex;
}Person;
typedef Person DataType;
typedef struct Squeue
{
DataType queue[QueueSize];
int front, rear;
}SeqQueue;//少用一个存储单元的循环顺序队列
void InitQueue(SeqQueue *SCQ)
//初始化
{
SCQ->front = SCQ->rear = 0;
}
int QueueEmpty(SeqQueue SCQ)
//判断循环队列是否为空,为空返回1
{
if (SCQ.front == SCQ.rear)
return 1;
else
return 0;
}
int EnQueue(SeqQueue *SCQ, DataType e)
//将e入队列,成功返回1,失败返回0
{
if (SCQ->front == (SCQ->rear + 1) % QueueSize)//判断对尾指针是否会发生上溢
return 0;
else //入队
{
SCQ->queue[SCQ->rear] = e;
//SCQ->rear++;
SCQ->rear = (SCQ->rear + 1) % QueueSize;
return 1;
}
}
int DeQueue(SeqQueue *SCQ, DataType *e)
//将队头元素出队列,删除成功返回1,失败返回0
{
if (SCQ->front == SCQ->rear)//空队列,返回1
return 0;
else
{
(*e) = SCQ->queue[SCQ->front];
SCQ->front = (SCQ->front + 1) % QueueSize;
return 1;
}
}
int GetHead(SeqQueue SCQ, DataType *e)
//取对头元素,返回给e,成功函数返回1,失败返回0
{
if (SCQ.front == SCQ.rear)//判断是否为空
{
return 0;
}
else
{
(*e) = SCQ.queue[SCQ.front];
return 1;
}
}
void ClearQueue(SeqQueue *SCQ)
{
SCQ->front = SCQ->rear = 0;
}
源代码:
// Queque.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//根据记录创建男队和女队,男女队头依次出队直到有一个队为空,输出剩下的队的人数及队头人
#include "pch.h"
#include"SeqQueue.h"
#include <iostream>
#include <stdio.h>
#include<stdlib.h>
using namespace std;
#define TOTALL_DANCER_NUM 10
int CountRemain(SeqQueue SCQ)
{
if (SCQ.front >= SCQ.rear)
return SCQ.rear + QueueSize - SCQ.front;
else
return SCQ.rear - SCQ.front;
}
DataType GetHead(SeqQueue SCQ)
{
if (!QueueEmpty(SCQ))
return SCQ.queue[SCQ.front];
}
int main()
{
DataType dancer[TOTALL_DANCER_NUM];
int i;
DataType m_dancer, f_dancer;
for (i = 0; i < TOTALL_DANCER_NUM; i++)
{
printf("输入第%d个人的姓名:\n", i + 1);
//scanf_s("%s", dancer[i].name);
cin >> dancer[i].name;
printf("输入第%d个人的性别:\n", i + 1);
cin >> dancer[i].sex;
//scanf_s("%c", &dancer[i].sex);
}
//创建两个队列
SeqQueue MSCQ, FSCQ;
InitQueue(&MSCQ);//初始化
InitQueue(&FSCQ);
/*将男的放入队列MSCQ,女的放入FSCQ*/
for (i = 0; i < TOTALL_DANCER_NUM; i++)
{
if (dancer[i].sex == 'M')
EnQueue(&MSCQ, dancer[i]);
else
EnQueue(&FSCQ, dancer[i]);
}
while ((MSCQ.front != MSCQ.rear) && (FSCQ.front != FSCQ.rear))//如果有一个队列为空则不能配对
{
//队头元素出队
DeQueue(&MSCQ,&m_dancer);
DeQueue(&FSCQ, &f_dancer);
//输出配队的舞伴
cout << "舞伴:" << m_dancer.name << "(" << m_dancer.sex << ")" << "<--->" << f_dancer.name << "(" << f_dancer.sex << ")" << endl;
}
if (QueueEmpty(MSCQ))
{
cout << "未配对的人还有" << CountRemain(FSCQ) << "个" << endl;
cout << "排在队列的第一个人为" << GetHead(FSCQ).name << "(" << GetHead(FSCQ).sex << ")" << endl;
}
else if(QueueEmpty(FSCQ))
{
cout << "未配对的人还有" << CountRemain(MSCQ) << "个" << endl;
cout << "排在队列的第一个人为" << GetHead(MSCQ).name << "(" << GetHead(MSCQ).sex << ")" << endl;
}
else
{
cout << "没有人剩余" << endl;
}
}