舞伴问题。假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求编写程序实现上述舞伴配对问题。 案例分析:对于舞伴配对问题,先入队的男士或女士先出队配成舞伴,因此设置两个队列分别存放男士和女士入队者。假设男士和女士的记录存放在一个数组中作为输入,然后依次扫描该数组的各元素,并根据性别来决定是进入男队还是女队。 当这两个队列构造完成之后,依次将两队当前的队头元素出队来配成舞伴,直至某队列变空为止。 此时,若某队仍有等待配对者,则输出此队列中排在队头的等待者的姓名,此人将是下一轮舞曲开始时第一个可获得舞伴的人。用c实现并给出源代码
时间: 2024-03-14 08:43:56 浏览: 134
以下是用 C 语言实现舞伴配对问题的源代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100 // 最大队列长度
typedef struct {
char name[20]; // 姓名
char sex; // 性别,'M' 表示男性,'F' 表示女性
} Person;
typedef struct {
Person data[MAX_SIZE]; // 队列元素数组
int front; // 队头指针
int rear; // 队尾指针
} Queue;
// 初始化队列
void InitQueue(Queue *q) {
q->front = q->rear = 0;
}
// 判断队列是否为空
int IsQueueEmpty(Queue *q) {
return q->front == q->rear;
}
// 判断队列是否已满
int IsQueueFull(Queue *q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
// 入队
int EnQueue(Queue *q, Person x) {
if (IsQueueFull(q)) {
return 0; // 队列已满,入队失败
}
q->data[q->rear] = x;
q->rear = (q->rear + 1) % MAX_SIZE;
return 1; // 入队成功
}
// 出队
int DeQueue(Queue *q, Person *x) {
if (IsQueueEmpty(q)) {
return 0; // 队列为空,出队失败
}
*x = q->data[q->front];
q->front = (q->front + 1) % MAX_SIZE;
return 1; // 出队成功
}
int main() {
Queue maleQueue, femaleQueue;
InitQueue(&maleQueue);
InitQueue(&femaleQueue);
// 输入男性和女性名单
int maleNum, femaleNum;
printf("请输入男性人数和女性人数:");
scanf("%d %d", &maleNum, &femaleNum);
printf("请输入男性名单:\n");
for (int i = 0; i < maleNum; i++) {
Person male;
printf("第 %d 个男性的姓名和性别(M/F):", i+1);
scanf("%s %c", male.name, &(male.sex));
EnQueue(&maleQueue, male);
}
printf("请输入女性名单:\n");
for (int i = 0; i < femaleNum; i++) {
Person female;
printf("第 %d 个女性的姓名和性别(M/F):", i+1);
scanf("%s %c", female.name, &(female.sex));
EnQueue(&femaleQueue, female);
}
// 配对
while (!IsQueueEmpty(&maleQueue) && !IsQueueEmpty(&femaleQueue)) {
Person male, female;
DeQueue(&maleQueue, &male);
DeQueue(&femaleQueue, &female);
printf("%s 和 %s 配对成功!\n", male.name, female.name);
}
// 输出等待配对者
if (!IsQueueEmpty(&maleQueue)) {
printf("%s 等待下一轮配对\n", maleQueue.data[maleQueue.front].name);
}
if (!IsQueueEmpty(&femaleQueue)) {
printf("%s 等待下一轮配对\n", femaleQueue.data[femaleQueue.front].name);
}
return 0;
}
```
该程序先输入男性和女性名单,并将其分别入队,然后依次出队一对男女配成舞伴,直至某一队列为空。最后,如果有队列中还有等待配对者,则输出其姓名。
阅读全文