#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PEOPLE 100
#define MAX_NAME_LENGTH 50
// 定义人的结构体
typedef struct {
char name[MAX_NAME_LENGTH];
char gender; // 'm' for male, 'f' for female
} Person;
// 定义队列的结构体
typedef struct {
Person people[MAX_PEOPLE];
int front; // 队头
int rear; // 队尾
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = 0;
q->rear = -1;
}
// 判断队列是否为空
int isEmpty(Queue *q) {
return q->front > q->rear;
}
// 入队
void enqueue(Queue *q, Person p) {
if (q->rear == MAX_PEOPLE - 1) {
printf("Queue is full!\n");
return;
}
q->rear++;
q->people[q->rear] = p;
}
// 出队
int dequeue(Queue *q, Person *p) {
if (isEmpty(q)) {
printf("Queue is empty!\n");
return 0;
}
*p = q->people[q->front];
q->front++;
return 1;
}
// 舞伴配对函数
void dancePartnerAssignment(Person people[], int n) {
Queue maleQueue, femaleQueue;
initQueue(&maleQueue);
initQueue(&femaleQueue);
// 将人加入对应的队列
for (int i = 0; i < n; i++) {
if (people[i].gender == 'm') {
enqueue(&maleQueue, people[i]);
} else if (people[i].gender == 'f') {
enqueue(&femaleQueue, people[i]);
}
}
// 配对舞伴
Person male, female;
while (!isEmpty(&maleQueue) && !isEmpty(&femaleQueue)) {
if (dequeue(&maleQueue, &male) && dequeue(&femaleQueue, &female)) {
printf("男士 %s 与 女士 %s 配成舞伴\n", male.name, female.name);
}
}
// 检查是否有剩余的人
if (!isEmpty(&maleQueue) && dequeue(&maleQueue, &male)) {
printf("男士 %s 将是下一轮舞曲开始时第一个可获得舞伴的人\n", male.name);
} else if (!isEmpty(&femaleQueue) && dequeue(&femaleQueue, &female)) {
printf("女士 %s 将是下一轮舞曲开始时第一个可获得舞伴的人\n", female.name);
}
}
int main() {
Person people[MAX_PEOPLE];
int n;
// 读取人数
printf("请输入跳舞的总人数: ");
scanf("%d", &n);
// 读取每个人的姓名和性别
for (int i = 0; i < n; i++) {
printf("请输入第%d个人的姓名和性别(m/f),中间用空格隔开: ", i + 1);
scanf("%s %c", people[i].name, &people[i].gender);
}
// 执行舞伴配对
dancePartnerAssignment(people, n);
return 0;
}