数据结构舞伴问题

舞伴问题

1、先建立一个舞者队列,依次往队列中添加人员信息;

2、分别创建男女队列;

3、从舞者队列中依次将队首元素出队并判断其性别并添加至男队或女队;

4、分别从男队和女队出队队首元素并配对输出;

5、将未完成的一队队首元素输出(男队的队首成员名称);

二、主要函数算法步骤及代码展示

【算法步骤】

1、初始化Mdancers队列和Fdancers队列;

2、反复循环,依次将跳舞者姓名根据性别插入Mdancers队列和Fdancers队列;

3、当Mdancers队列和Fdancers队列均为非空时,反复循环,依次输出男女舞伴的姓名;

4、如果Mdancers队列为空和Fdancers队列为非空时,则输出Fdancers对列的队头女士的姓名;

5、如果Fdancers队列为空和Mdancers队列为非空时,则输出Mdancers队列的队头男士的姓名;

【算法描述】

//舞伴问题解决
void dancersolve(Person dancer[], int num, int m, SqQueue male, SqQueue female)
{//结构体数组中dancer中存放跳舞的男女姓名,num是跳舞的人数
    for (int j = 0; j < m; j++)
    {
        cout << "第" << j + 1 << "轮:" << endl;
        for (int i = 0; i < num; i++)
        {
            if (dancer[i].sex == 'F')
                EnQueue(female, dancer[i]);//插入女队
            else
                EnQueue(male, dancer[i]);//插入男队
        }
        cout << "The dancing partners are:\n";
        while (!QueueEmpty(male) && !QueueEmpty(female))
        {//依次输入男女舞伴问题
            Person p;
            DeQueue(male, p);
            cout << p.name << ' ';//女士出列
            DeQueue(female, p);
            cout << p.name << endl;//男士出列
        }
        Person e;
        if (!QueueEmpty(female))//女士队列非空,输出队头女士的姓名
        {
            e = GetHead(female);//取女士队头
            cout << "The first woman to get a partner is:" << e.name << endl;
        }
        else if (!QueueEmpty(male))//男士队列非空,输出队头男士的姓名
        {
            e = GetHead(female);//取男士队头
            cout << "The first man to get a partner is:" << e.name << endl;
        }
    }
}

完整代码:

#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100

typedef int Status;

/*跳舞这个人信息*/
typedef struct
{
    char name[20];//名字
    char sex;//F为女性,M为男性
}Person;

/*队列的顺序存储结构*/
typedef struct
{
    Person* base;//队列中数据元素类型为Person
    int front;//头指针
    int rear;//尾指针
}SqQueue;

typedef Person ElemType;

/*队列初始化*/
Status InitQueue(SqQueue& Q)
{//构造一个空队列Q
    Q.base = new Person[MAXSIZE];
    if (!Q.base)
        exit(OVERFLOW);
    Q.front = Q.rear = 0;
    return OK;
}

/*求队列的长度*/
int QueueLength(SqQueue* Q)
{
    return(Q->rear - Q->front + MAXSIZE) % MAXSIZE;
}

/*判断队列是否为空*/
bool QueueEmpty(SqQueue& Q)
{
    if (Q.front == Q.rear)
        return true;//队满
    else
        return false;
}

Status EnQueue(SqQueue& Q, Person e)
{//插入元素e为Q的新的队尾元素
    if ((Q.rear + 1) % MAXSIZE == Q.front)//尾指针在循环意义上加1后等于头指针,表明队满
    {
        return ERROR;
    }
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear + 1) % MAXSIZE;//队尾指针加1
    return OK;
}

/*出队(保留队头元素)删除Q的队头元素,用e返回其值*/
Status DeQueue(SqQueue& Q, Person& e)
{
    if (Q.front == Q.rear)
        return ERROR;//队空
    e = Q.base[Q.front];  //保留队头元素
    Q.front = (Q.front + 1) % MAXSIZE;//队头指针加1
    return OK;
}

/*出队(不保留对头元素)*/
Status DeQueuee(SqQueue& Q)
{
    if (Q.front == Q.rear)
        return ERROR;
    Q.front = (Q.front + 1) % MAXSIZE;
    return OK;
}

//取队头元素
Person GetHead(SqQueue& Q)
{//返回Q的队头元素,不修改队头指针
    if (Q.rear != Q.front)
    {
        return Q.base[Q.front];//返回队头元素的值,队头指针不变
    }//队列非空
}

//舞伴问题解决
void dancersolve(Person dancer[], int num, int m, SqQueue male, SqQueue female)
{//结构体数组中dancer中存放跳舞的男女姓名,num是跳舞的人数
    for (int j = 0; j < m; j++)
    {
        cout << "第" << j + 1 << "轮:" << endl;
        for (int i = 0; i < num; i++)
        {
            if (dancer[i].sex == 'F')
                EnQueue(female, dancer[i]);//插入女队
            else
                EnQueue(male, dancer[i]);//插入男队
        }
        cout << "The dancing partners are:\n";
        while (!QueueEmpty(male) && !QueueEmpty(female))
        {//依次输入男女舞伴问题
            Person p;
            DeQueue(male, p);
            cout << p.name << ' ';//女士出列
            DeQueue(female, p);
            cout << p.name << endl;//男士出列
        }
        Person e;
        if (!QueueEmpty(female))//女士队列非空,输出队头女士的姓名
        {
            e = GetHead(female);//取女士队头
            cout << "The first woman to get a partner is:" << e.name << endl;
        }
        else if (!QueueEmpty(male))//男士队列非空,输出队头男士的姓名
        {
            e = GetHead(female);//取男士队头
            cout << "The first man to get a partner is:" << e.name << endl;
        }
    }
}

//主函数
int main()
{
    int n;
    cout << "请输入跳舞人的人数:";
    cin >> n;
    Person* dancer = new Person[n];
    cout << "请依次输入跳舞人的信息:" << endl;
    for (int i = 0; i < n; i++)
    {
        cout << "name:";
        cin >> dancer[i].name;
        cout << "sex:";
        cin >> dancer[i].sex;
    }
    int m;
    cout << "请输入舞会的轮数:";
    cin >> m;

    SqQueue male, female;
    InitQueue(male);
    InitQueue(female);

    dancersolve(dancer, n, m, male, female);
    return 0;
}

运行结果展示:

 第一次写,如果有不正确之处,请留言!

帮忙点个关注!!!

  • 13
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
C语言数据结构舞伴问题是一个经典的算法问题,也被称为约瑟夫问题。该问题描述了一群人围成一圈,从某个人开始,每次数到某个数字的人出圈,直到只剩下最后一个人。而舞伴问题则是描述了两个队列,男队和女队,每次从队头各取一个人配对跳舞,如果两队人数不相等,则较长的一队中未配对者等待下一轮舞曲。 解决舞伴问题的一种常见方法是使用循环队列。首先将男队和女队分别存储在两个循环队列中,然后每次从队头各取一个人配对跳舞,如果两队人数不相等,则将较长的一队中未配对者移到队尾,等待下一轮舞曲。这个过程一直进行,直到其中一个队列为空。 以下是一个简单的C语言代码实现舞伴问题的算法: ``` #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 typedef struct { char data[MAX_SIZE]; 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) % MAX_SIZE == q->front; } void enqueue(Queue *q, char x) { if (isFull(q)) { printf("Queue is full.\n"); exit(1); } q->data[q->rear] = x; q->rear = (q->rear + 1) % MAX_SIZE; } char dequeue(Queue *q) { if (isEmpty(q)) { printf("Queue is empty.\n"); exit(1); } char x = q->data[q->front]; q->front = (q->front + 1) % MAX_SIZE; return x; } int main() { Queue male, female; initQueue(&male); initQueue(&female); // 初始化男队和女队 char m[] = {'1', '2', '3', '4'}; char f[] = {'a', 'b', 'c'}; int mSize = sizeof(m) / sizeof(m[0]); int fSize = sizeof(f) / sizeof(f[0]); for (int i = 0; i < mSize; i++) { enqueue(&male, m[i]); } for (int i = 0; i < fSize; i++) { enqueue(&female, f[i]); } // 开始跳舞 int round = 1; while (!isEmpty(&male) && !isEmpty(&female)) { printf("Round %d:\n", round++); char m = dequeue(&male); char f = dequeue(&female); printf("%c and %c are dancing.\n", m, f); if (male.rear - male.front > female.rear - female.front) { enqueue(&male, m); } else { enqueue(&female, f); } } // 输出结果 if (isEmpty(&male)) { printf("Male queue is empty.\n"); printf("Remaining female queue: "); while (!isEmpty(&female)) { printf("%c ", dequeue(&female)); } } else { printf("Female queue is empty.\n"); printf("Remaining male queue: "); while (!isEmpty(&male)) { printf("%c ", dequeue(&male)); } } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值