舞伴问题 队列(c语言)
时间: 2023-11-26 14:03:57 浏览: 148
舞伴问题是指在一个舞会上男女混合在一起,每个人都有一个编号,现在需要将他们两两配对成舞伴。如果男女人数不相等,则无法一一匹配。现在假设男女人数相等,用队列实现舞伴匹配算法。
以下是使用C语言实现的队列舞伴问题代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 定义队列的最大长度
typedef struct {
int id; // 编号
char sex; // 性别
} Person;
typedef struct {
Person data[MAXSIZE]; // 队列数组
int front, rear; // 队首和队尾指针
} Queue;
// 初始化队列
void InitQueue(Queue *Q) {
Q->front = Q->rear = 0;
}
// 判断队列是否为空
int IsEmpty(Queue Q) {
return Q.front == Q.rear;
}
// 判断队列是否已满
int IsFull(Queue Q) {
return (Q.rear + 1) % MAXSIZE == Q.front;
}
// 入队操作
void EnQueue(Queue *Q, Person p) {
if (IsFull(*Q)) {
printf("队列已满,无法入队!\n");
return;
}
Q->data[Q->rear] = p;
Q->rear = (Q->rear + 1) % MAXSIZE;
}
// 出队操作
Person DeQueue(Queue *Q) {
if (IsEmpty(*Q)) {
printf("队列已空,无法出队!\n");
exit(0);
}
Person p = Q->data[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;
return p;
}
int main() {
Queue male, female; // 定义男队和女队
InitQueue(&male);
InitQueue(&female);
int n, i;
printf("请输入男女人数n:");
scanf("%d", &n);
Person p;
for (i = 1; i <= n; i++) {
printf("第%d个人:\n", i);
printf("编号:");
scanf("%d", &p.id);
printf("性别(m/f):");
getchar(); // 读取换行符
scanf("%c", &p.sex);
if (p.sex == 'm') {
EnQueue(&male, p);
} else if (p.sex == 'f') {
EnQueue(&female, p);
} else {
printf("性别输入错误!\n");
i--;
}
}
printf("\n舞伴配对情况如下:\n");
while (!IsEmpty(male) && !IsEmpty(female)) {
Person male_p = DeQueue(&male);
Person female_p = DeQueue(&female);
printf("%d号男士和%d号女士成为舞伴!\n", male_p.id, female_p.id);
}
if (!IsEmpty(male) || !IsEmpty(female)) {
printf("男女人数不相等,无法一一匹配!\n");
}
return 0;
}
```
运行程序,输入男女人数和每个人的编号和性别,程序会按照性别将人员分别入队,然后依次配对成舞伴输出,最后判断是否有剩余未配对的人员。
阅读全文