舞伴问题 队列(C语言)

问题描述
假设在周末舞会上,男士和女士进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一个配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
问题分析
对于舞伴配对问题,先入队的男士或女士先出队配成舞伴,因此设置两个队列分别存放男士和女士入队者。输入舞者的记录根据性别来决定是进入男队还是女队。当这两个队列构造完成之后,依次将两队当前的队头元素出队来配成舞伴,直至某队列变空为止。此时,若某队仍有等待配对者,则输出此队列中排在队头的等待者的姓名,此人将是下一轮舞曲开始时第一个可获得舞伴的人。
算法步骤
(1)初始化man队列和woman队列
(2)循环读入舞者的名字和性别,根据性别插入man队列或woman队列
(3)如果两个队列都非空,依次输出男女舞伴
(4)如果man队列空woman队列非空,输出woman队列的队头女士姓名
(5)如果woman队列空man队列非空,输出man队列的对头男士姓名
完整代码

#include<stdio.h>
#include<string.h> 
#include<stdlib.h>
struct person{
   
	char name[20];
	char sex[10];
};
typedef struct QNode{
   
	struct person Person;
	struct QNode * next;
}QNode, * QueuePtr;   //舞者的队列结构体 
typedef struct{
   
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;
void InitQueue(LinkQueue &Q){
   
	Q.front=(QueuePtr)malloc(sizeof
  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
舞伴问题是指在一个舞会上男女混合在一起,每个人都有一个编号,现在需要将他们两两配对成舞伴。如果男女人数不相等,则无法一一匹配。现在假设男女人数相等,用队列实现舞伴匹配算法。 以下是使用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; } ``` 运行程序,输入男女人数和每个人的编号和性别,程序会按照性别将人员分别入队,然后依次配对成舞伴输出,最后判断是否有剩余未配对的人员。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值