海鼠造福世界
功能就是队列循环的舞伴问题
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// 舞者结构体
typedef struct {
char name[20];
char gender; // 'F'表示女舞者,'M'表示男舞者
} Dancer;
// 队列结构体
typedef struct {
Dancer data[MAX_SIZE];
int front;
int rear;
} Queue;
// 初始化队列
void InitQueue(Queue* queue) {
queue->front = 0;
queue->rear = 0;
}
// 判断队列是否为空
int QueueEmpty(Queue* queue) {
return queue->front == queue->rear;
}
// 入队
int EnQueue(Queue* queue, Dancer dancer) {
if ((queue->rear + 1) % MAX_SIZE == queue->front) {
// 队列已满,无法入队
return 0;
}
queue->data[queue->rear] = dancer;
queue->rear = (queue->rear + 1) % MAX_SIZE;
return 1;
}
// 出队
Dancer DeQueue(Queue* queue) {
Dancer dancer = queue->data[queue->front];
queue->front = (queue->front + 1) % MAX_SIZE;
return dancer;
}
// 获取队头元素
Dancer GetHead(Queue queue) {
return queue.data[queue.front];
}
// 清空队列
void ClearQueue(Queue* queue) {
queue->front = 0;
queue->rear = 0;
}
// 打印队列中的舞者姓名
void PrintQueue(Queue queue) {
int i;
for (i = queue.front; i != queue.rear; i = (i + 1) % MAX_SIZE) {
printf("%s\n", queue.data[i].name);
}
}
// 舞者匹配函数
void DanceMatch() {
Queue femaleDancers; // 女舞者队列
Queue maleDancers; // 男舞者队列
InitQueue(&femaleDancers);
InitQueue(&maleDancers);
while (1) {
// 输入舞者信息并入队
printf("请输入女舞者的数量(输入0结束循环): ");
int numFemale;
scanf("%d", &numFemale);
getchar(); // 读取换行符
if (numFemale == 0) {
break; // 结束循环
}
printf("请依次输入女舞者的姓名:\n");
int i;
for (i = 0; i < numFemale; i++) {
Dancer dancer;
scanf("%s", dancer.name);
dancer.gender = 'F';
EnQueue(&femaleDancers, dancer);
}
printf("\n");
printf("请输入男舞者的数量: ");
int numMale;
scanf("%d", &numMale);
getchar(); // 读取换行符
printf("请依次输入男舞者的姓名:\n");
for (i = 0; i < numMale; i++) {
Dancer dancer;
scanf("%s", dancer.name);
dancer.gender = 'M';
EnQueue(&maleDancers, dancer);
}
printf("\n");
// 匹配舞伴的逻辑
printf("舞伴匹配结果:\n");
while (!QueueEmpty(&femaleDancers) && !QueueEmpty(&maleDancers)) {
Dancer female = DeQueue(&femaleDancers);
Dancer male = DeQueue(&maleDancers);
if (female.gender == 'F' && male.gender == 'M') {
printf("%s 和 %s\n", female.name, male.name);
} else {
printf("舞者性别不匹配,无法成为舞伴\n");
}
}
printf("\n");
// 判断下一轮第一个可获得舞伴的舞者
if (!QueueEmpty(&femaleDancers)) {
Dancer dancer = GetHead(femaleDancers);
printf("下一轮第一个可获得舞伴的女舞者为: %s\n", dancer.name);
} else {
printf("当前无可获得舞伴的女舞者,将跳过本轮女舞者匹配\n");
}
if (!QueueEmpty(&maleDancers)) {
Dancer dancer = GetHead(maleDancers);
printf("下一轮第一个可获得舞伴的男舞者为: %s\n", dancer.name);
} else {
printf("当前无可获得舞伴的男舞者,将跳过本轮男舞者匹配\n");
}
printf("\n");
}
}
int main() {
DanceMatch();
return 0;
}