数据结构(三):舞伴配对问题(C++,队列)

数据结构,舞伴,配对,问题,c++,队列 · 浏览次数 : 891

小编点评

```c++ #include <iostream> using namespace std;//定义一个人的结构体,用于存放参加舞会的人员的名字和性别typedef struct { char name[20]; char sex;}Person;//定义一个队列的结构体,成员变量有结构体数组、头指针、尾指针和队列长度typedef struct { Person person[20]; int front1=0; int rear=0; int count1=0;}SqQuene;//配对函数void Arrange(Person* person,SqQuene* Male,SqQuene* Female,int num){ cout<<\"请输入参与舞会的人员的名字和性别:(M/m:男 F/f:女)\"<<endl; //根据你输入的人数,进行循环输入成员的信息,同时根据成员的性别分别插入对应的队列 for(int i = 0;i < num; i++) { cin>>person[i].name>>person[i].sex; if(person[i].sex == 'M' || person[i].sex == 'm') { Male->person[Male->rear++] = person[i]; Male->count1++; } else if(person[i].sex == 'F' || person[i].sex == 'f') { Female->person[Female->rear++] = person[i]; Female->count1++; } else { cout<<\"您的输入有误,请重新输入!\"<<endl; //如果输入的性别有误,就重新输入,并保证人数不会出错 i--; } } cout<<\"配对结果:\"<<endl; cout<<\"男 女\"<<endl; while(Male->count1 > 0 && Female->count1 > 0) //当两个队列的个数不为0时,输出两个队列的对头元素 { cout<<Male->person[Male->front1].name<<\"——\"<<Female->person[Female->front1].name<<endl; Male->front1++; Female->front1++; Male->count1--; Female->count1--; } //如果男士队有剩余,输出男士队的队头元素 if(Male->count1 > 0) { cout<<\"下一轮男生队伍的第一位:\"<<Male->person[Male->front1].name<<endl; } //如果女士队有剩余,输出女士队的队头元素 if(Female->count1 > 0) { cout<<\"下一轮女生队伍的第一个:\"<<Female->person[Female->front1].name<<endl; } delete []person; //释放数组所占空间 cout<<\"感谢您的使用,再见!\"<<endl; } ```

正文

好家伙,

 

题目如下:

1.舞伴配对问题:假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴

2.若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。要求编写程序,模拟上述舞伴配对问题,且规定:

程序的输入时:进入舞厅人员的姓名和性别。

程序输出是:如果是配对的,则输出两个舞伴的人的姓名;

      如果是未配成对的,则输出等待配对的人数和下一轮舞曲开始时第一个可获得舞伴的人。

 

 

题目分析如下:

首先建立两个队列,一个队列存放男士,一个队列存放女士,

配对时,每轮每个队列的队头元素出来配对,未配对的放到下一轮继续配对。

最后,将有剩余的男或女输出

(用m和f分别表示男和女,m:male,f:female)

#include <iostream>
using namespace std;
//定义一个人的结构体,用于存放参加舞会的人员的名字和性别
typedef struct        
{
    char name[20];
    char sex;
}Person;

//定义一个队列的结构体,成员变量有结构体数组、头指针、尾指针和队列长度
typedef struct      
{
    Person person[20];
    int front1=0;
    int rear=0;
    int count1=0;
}SqQuene;

//配对函数
void Arrange(Person* person,SqQuene* Male,SqQuene* Female,int num)
{
    cout<<"请输入参与舞会的人员的名字和性别:(M/m:男 F/f:女)"<<endl;
    //根据你输入的人数,进行循环输入成员的信息,同时根据成员的性别分别插入对应的队列
    for(int i = 0;i < num; i++)   
    {
        cin>>person[i].name>>person[i].sex;
        if(person[i].sex == 'M' || person[i].sex == 'm')
        {
            Male->person[Male->rear++] = person[i];
            Male->count1++;
        }
        else if(person[i].sex == 'F' || person[i].sex == 'f')
        {
            Female->person[Female->rear++] = person[i];
            Female->count1++;
        }
        else
        {
            cout<<"您的输入有误,请重新输入!"<<endl;   //如果输入的性别有误,就重新输入,并保证人数不会出错
            i--;
        }
    }

    cout<<"配对结果:"<<endl;
    cout<<"男     女"<<endl;
    while(Male->count1 > 0 && Female->count1 > 0)  //当两个队列的个数不为0时,输出两个队列的对头元素
    {
        cout<<Male->person[Male->front1].name<<"——"<<Female->person[Female->front1].name<<endl;
        Male->front1++;
        Female->front1++;
        Male->count1--;
        Female->count1--;
    }

    //如果男士队有剩余,输出男士队的队头元素
    if(Male->count1 > 0)                
    {
        cout<<"下一轮男生队伍的第一位:"<<Male->person[Male->front1].name<<endl;
    }
    
    //如果女士队有剩余,输出女士队的队头元素
    if(Female->count1 > 0)              
    {
        cout<<"下一轮女生队伍的第一位:"<<Female->person[Female->front1].name<<endl;
    }
    //否则无剩余
    if(Male->count1 == 0 && Female->count1 == 0)
    {
        cout<<"该轮无剩余人员!"<<endl; 
    }
}


int main()
{
    int num,flag = 1;              //定义两个变量,一个存放插入的人数,一个是标志变量
    Person* person = new Person[20]; //定义一个结构体数组
    SqQuene* female = new SqQuene;   //定义一个指向女队列的队列指针
    SqQuene* male = new SqQuene;     //定义一个指向男队列的队列指针
    while(flag == 1)                 //判断循环条件
    {
        cout<<"请输入本轮跳舞的人数:"<<endl;
        cin>>num;
        Arrange(person,male,female,num);        //调用配对函数
        cout<<"输入1继续"<<endl;
        cin>>flag;                              //判断变量是否满足循环条件
    }
    delete []person;                           //释放数组所占空间
    cout<<"感谢您的使用,再见!"<<endl;
    return 0;
}

 

输入样例:

panghu m

xiaofu m

jinxiang f

xiaohong f

xiaobing f

 

输出样例:

男     女

panghu——jinxiang

xiaofu——xiaohong

下一轮女生队伍的第一个:xiaobing

 

图示:

 

与数据结构(三):舞伴配对问题(C++,队列)相似的内容:

数据结构(三):舞伴配对问题(C++,队列)

好家伙, 题目如下: 1.舞伴配对问题:假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。 2.若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。要求编写程序,模拟上述舞伴配对问题,且规定: 程序的输入时:进入舞厅人员的姓名和

数据结构与算法 #18 下跳棋,极富想象力的同向双指针模拟

> ⭐️ **本文已收录到 [AndroidFamily](https://github.com/pengxurui/AndroidFamily),技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问。** > > 学习数据结构与算法的关键在于掌握问题背后的算法思

数据结构(四):(顺序表)设计算法删除所有数字字符

好家伙,写作业 什么是顺序表: 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、 使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系, 采用顺序存

数据结构(二):括号匹配(C++,栈)

好家伙,写题,题目代码在最后 来吧, 1.栈 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。 这一端被称为栈顶,相对地,把另一端称为栈底。 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素; 从一个栈删除元素

数据结构作业(五):直接插入排序 和 归并排序

好家伙,写作业 1.直接插入排序 这是个非常简单的排序 将一串数分为有序区和无序区 然后将无序区的数一个个按照正确的顺序放到有序区 2.归并排序 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 若将两个有序表合并成一个有序表,称为二路归并。 其中我们要解决的一个

数据结构与算法大作业:走迷宫程序(C语言,DFS)(代码以及思路)

好家伙,写大作业,本篇为代码的思路讲解 1.大作业要求 走迷宫程序 问题描述: 以一个 m * n 的长方阵表示迷宫, 0和1分别表示迷宫的通路和障碍。 设计一个程序, 对任意设定的迷宫, 求出一条从入口到出口的通路, 或得出没有通路的结论。 基本要求: (1) 实现一个以链表做存储的栈类型, 然后

数据结构与算法大作业:走迷宫程序(实验报告)

好家伙,本篇为应付老师的实验报告,有需要的拿去抄吧 思路讲解在上一篇: 数据结构与算法大作业:走迷宫程序(C,代码以及思路) 一、作业目的 1、 掌握用数据结构的知识进行程序设计。 2、 应用所学的数据结构完成一个具有一定实际意义的应用程序的设计、编码、调试,锻炼实践动手能力,提高编程水平。 二、作

[转帖]各种数据结构性能的比较

数据结构包括数组、链表、栈、二叉树、哈希表等等 数据结构优点缺点数组插入快查找慢、删除慢、大小固定有序数组查找快插入慢、删除慢、大小固定栈后进先出存取其他项很慢队列先进先出存取其他项很慢链表插入、删除快查找慢二叉树查找、插入、删除快算法复杂(删除算法)红黑树查找、插入、删除快算法复杂hash表存取极

【数据结构和算法】Trie树简介及应用详解

Trie树,即字典树,又称单词查找树或键树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

数据结构小结

个人认为数据结构有点偏向理论知识点,从这些理论知识点,我们可以知道各种数据结构的特点,然后在特定的场景下使用对应的数据结构来存储。 基础的数据结构 从逻辑上来说基础的数据结构只有线性结构、非线性结构,也就是数组、链表。其他复杂一点的如队列、栈、树、图、hash table 都可以通过数组和链表的方式