c++全代码实现队列的舞伴问题

海鼠造福世界

功能就是队列循环的舞伴问题

#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;
}

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值