用c使用循环队列解决舞伴问题
时间: 2024-05-04 19:18:14 浏览: 222
舞伴问题(采用队列实现)
舞伴问题可以使用循环队列来解决,具体步骤如下:
1. 首先定义一个循环队列,并初始化为空队列。
2. 输入男女生的数量,分别存入两个数组中。
3. 将男生和女生分别入队。
4. 循环取出男生队列和女生队列的队首,进行匹配,如果匹配成功,输出匹配信息,否则将男生重新入队,女生队首出队并重新入队。
5. 重复第4步,直到队列为空或者男生或女生队列为空。
下面是用C语言实现的舞伴问题代码:
```c
#include <stdio.h>
#define MAXSIZE 50
typedef struct {
char name[20];
int sex; // 0为女性,1为男性
} Person;
typedef struct {
Person data[MAXSIZE];
int front, rear;
} Queue;
void InitQueue(Queue *q) {
q->front = q->rear = 0;
}
int QueueLength(Queue *q) {
return (q->rear - q->front + MAXSIZE) % MAXSIZE;
}
int EnQueue(Queue *q, Person p) {
if ((q->rear + 1) % MAXSIZE == q->front) {
return 0; // 队列已满
}
q->data[q->rear] = p;
q->rear = (q->rear + 1) % MAXSIZE;
return 1;
}
int DeQueue(Queue *q, Person *p) {
if (q->front == q->rear) {
return 0; // 队列为空
}
*p = q->data[q->front];
q->front = (q->front + 1) % MAXSIZE;
return 1;
}
void PrintPerson(Person p) {
printf("%s", p.name);
if (p.sex == 0) {
printf("(女)");
} else {
printf("(男)");
}
}
int main() {
Queue male, female;
InitQueue(&male);
InitQueue(&female);
int n, i;
printf("请输入男女生的数量:");
scanf("%d", &n);
Person p;
for (i = 0; i < n; i++) {
printf("请输入第%d个男生的姓名:", i + 1);
scanf("%s", p.name);
p.sex = 1;
EnQueue(&male, p);
printf("请输入第%d个女生的姓名:", i + 1);
scanf("%s", p.name);
p.sex = 0;
EnQueue(&female, p);
}
printf("匹配结果如下:\n");
while (QueueLength(&male) > 0 && QueueLength(&female) > 0) {
DeQueue(&male, &p);
printf("男生 ");
PrintPerson(p);
DeQueue(&female, &p);
printf(" 和女生 ");
PrintPerson(p);
printf(" 匹配成功!\n");
}
return 0;
}
```
在这个例子中,我们使用了一个结构体 `Person` 来表示一个人,包含姓名和性别两个属性。我们同时定义了一个循环队列 `Queue`,用于存储男生和女生的队列。在程序中,我们首先输入男女生的数量,并将其存入队列中。然后循环取出男生队列和女生队列的队首,进行匹配,如果匹配成功,输出匹配信息,否则将男生重新入队,女生队首出队并重新入队。最后输出匹配结果。
阅读全文