队列-舞伴问题
林厚从信息学奥赛课课通第7单元第5课队列

练习1:海港(port,1s,256MB)
题目描述: 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多 来自不同国家的乘客。 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘 船只情况;对于第i艘到达的船,他记录了这艘船到达的时间ti (单位:秒), 船上的乘客数量ki,以及每名乘客的国籍 x(i,1), x(i,2),…,x(i,k);。 小K统计了n艘船的信息,希望你帮忙计算出以每一艘船到达时间为止的24小时 (24小时=86400秒)内所有乘船到达的乘客来自多少个不同的国家。 形式化地讲,你需要计算n条信息。对于输出的第i条信息,你需要统计满足 ti - 86400 < tp <= ti的船只p,在所有的x(p,j)中,总共有多少个不同的数。 输入格式: 第一行输入一个正整数n,表示小K统计了n艘船的信息。 接下来n行,每行描述一艘船的信息:前两个整数ti和ki分别表示这艘船到达海 港的时间和船上的乘客数量,接下来ki个整数x(i,j)表示船上乘客的国籍。 保证输入的ti是递增的,单位是秒;表示从小K第一次上班开始计时,这艘船在 第 ti 秒到达海港。 5,1<=x(i,j)<=105 保证 1<=n<=105,ki>=1, ∑ki≤3∗10 ,1<=ti-1<ti<=109 其中∑ki表示所有的ki的和, ∑ki =k1+k2+……+kn。 输出格式: 输出n行,第i行输出一个整数表示第i艘船到达后的统计信息。
样例输入: 24 6 样例输出: 11 22 13 24 11 22
例2:取牌游戏。(card,1s,256MB)
问题描述: 小明正在使用一堆共k张纸牌与n-1个朋友玩取牌游戏。其 中,n<=k<=100000,2<=n<=100,k是n的倍数。纸牌中包 含m=k/n张”good”牌和k-m张”bad”牌。小明负责发牌,他 当然想自己获得所有”good”牌。
数据结构(C++语言)---舞伴问题

}
while( (!mdancer.IsEmpty())&&!(fdancer.IsEmpty()) )
{
cout << mdancer.DeQueue().name << " --- " << fdancer.DeQueue().name <<endl;
}
if(!mdancer.IsEmpty())
{
char name[20];
char sex;
};
int main()
{
cout<<"请输入舞伴总数量"<<endl;
CirQueue<dancer> mdancer(10);
CirQueue<dancer> fdancer(10);
ifstream in("source.txt");
while(!in.eof())
{
cout<<"请输入舞者性别(f(女)or m(男))及姓名"<<endl;
dancer temp;
in >> temp.sex;
in >> ;
if (temp.sex == 'f')
{
fdancer.EnQueue(temp);
}
else
{
mdancer.EnQueue(temp);
{
if ((rear+1)%maxSize==front)
cout<<"Full"<<endl;
q[rear]=x;
数据结构实验报告2.3

数据结构实验报告2.3题⽬三:舞伴问题【实验⽬的】1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应⽤。
2、掌握栈和队列的特点,即后进先出和先进先出的原则。
3、掌握栈和队列的基本运算,如:⼊栈与出栈,⼊队与出队等运算在顺序存储结构和链式存储结构上的实现。
【问题描述】假设在周末舞会上,男⼠们和⼥⼠们进⼊舞厅时,各⾃排成⼀队。
跳舞开始时,依次从男队和⼥队的队头上各出⼀⼈配成舞伴。
若两队初始⼈数不相同,则较长的那⼀队中未配对者等待下⼀轮舞曲。
现要求写⼀算法模拟上述舞伴配对问题。
【实验要求】利⽤队列实现,存储结构采⽤顺序或链式均可【编程思路】男⼥配对问题的原则是先⼊先出进⾏配对,因此该问题具体有典型的先进先出特性,可⽤队列作为算法的数据结构。
在算法中,假设男⼠和⼥⼠的记录存放在⼀个数组中作为输⼊,然后依次扫描该数组的各元素,并根据性别来决定是进⼊男队还是⼥队。
当这两个队列构造完成之后,依次将两队当前的队头元素出队来配成舞伴,直⾄某队列变空为⽌。
如果某组有剩余则参与第⼆轮的配对,并将第⼀个需要配对学⽣的信息返回;如果完全配对,则返回信息,不再进⾏下⼀轮的配对。
开始时男⼠和⼥⼠的记录存放在⼀个结构体数组中作为输⼊,另外需要构建两个队列来保存男队和⼥队。
⽆论是结构体数组还男⼥队列的元素或结点都采取结构体类型。
作为输⼊的结构体数组可以事先创建即初始化时便将数据保存进去,也可以在程序运⾏时创建。
男⼥队列的存储类型可以采取顺序或链式结构。
⼆者的原理基本⼀致,但在操作上却有所不同:1、顺序存储结构的长度确定,存储容量有限。
开辟空间很⼤的话⼜浪费存储空间,⼀种解决⽅案是采⽤循环队列,可是本题⽬是将所⽤元素都存储完成以后才进⾏删除,采⽤循环队列便失去了意义。
2、链式存储结构长度不固定,输⼊数据可以不固定。
相⽐于顺序存储结构操作简单。
由于,输⼊数据是放在结构体数组中的,其最⼤长度已确定,间接限制了队列的最⼤长度,故采⽤顺序存储结构。
舞伴问题

1.舞伴问题
问题描述:一班有m个女生、n个男生(m不等于n), 举办一场舞会. 男女生分别编号坐在舞池两边的椅子上,每曲开始时, 依次从男生和女生中各出一人配对跳舞, 本曲没成功配对者坐着等待下一曲找舞伴,设计一个程序模拟舞伴配对过程。
基本要求:输入男、女学生的姓名、性别,由程序自动为男女生编号,可以顺序编号,也可以随机编号,输出每曲配对情况(包括男、女生的姓名、性别和编号)。
原始数据和结果数据要保存到文件中。
测试数据:分别选择男生多于女生、女生多于男生、男女生相等的三组测试数据
提高要求:计算出任意一位男生(编号为X)和任意一位女生(编号为Y), 在第K曲配对跳舞的情况。
考核要求:
(1)用队列表示男、女学生,能够从文件中读取数据,文件中至少包括三组测试数据,分别为男生多于女生、女生多于男生、男女生人数相等。
顺序输入舞曲的编号,对于每支舞曲,输入配对跳舞的男、女学生信息。
并把本支舞曲的配对情况保存到文件中。
完成上述任务,成绩为及格。
(2)在完成考核要求(1)的基础上,直接输出第K支舞曲的配对情况,能够处理异常,如文件空、只有男生或只有女生等。
成绩为中等。
舞会配对问题课程设计课案

数据结构课程设计报告撰写要求一)纸张与页面要求1 .采用国际标准A4 型打印纸或复印纸,纵向打印。
2 .封页和页面按照下面模板书写(正文为:小四宋体1.5 倍行距)。
3.图表及图表标题按照模板中的表示书写。
二)课设报告书的内容应包括以下各个部分:(按照以下顺序装订)1. 封页(见课设模版)2、学术诚信声明,所有学生必须本人签字,否则教师拒绝给予成绩。
2.任务书(学生教师均要签字, 信息填写完整)3. 目录4. 正文一般应包括以下内容:(1)题目介绍和功能要求(或描述)课程设计任务的详细描述(注意不能直接抄任务书), 将内容做更详细的具体的分析与描述;(2)系统功能模块结构图绘制系统功能结构框图及主要模块的功能说明;(3)使用的数据结构的描述: 数据结构设计及用法说明;(4)涉及到的函数的描述;(5)主要算法描述(程序流程图)(6)给出程序测试/ 运行的结果设计多组数据加以描述(包括输入数据和输出结果)(7)课程设计的总结及体会(8)参考文献格式要求:[1] 作者,等. 书名. 出版地:出版社,出版年5. 附录:程序清单(应带有必要的注释)沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:舞会配对问题院(系):专业:班级:学号:姓名:指导教师:说明:结论(优秀、良好、中等、及格、不及格)作为相关教环节考核必要依据;格式不符合要求;数据不实,不予通过。
报告和电子数据必须作为实验现象重复的关键依据。
指导教师评语:学术诚信声明日期:本人声明:所呈交的报告(含电子版及数据文ixin件)是我个人在导师指导下独立进行设计工作及取得的研究结果。
尽我所知,除了文中特别加以标注或致谢中所罗列的内容以外,报告中不包含其他人己经发表或撰写过的研究结果,也不包含其它教育机构使用过的材料。
与我一同工作的同学对本研究所做的任何贡献均己在报告中做了明确的说明并表示了谢意。
报告资料及实验数据若有不实之处,本人愿意接受本教学环节“不及格”和“重修或重做”的评分结论并承担相关一切后果。
用循环队列解决舞伴配对问题发现自己的问题

⽤循环队列解决舞伴配对问题发现⾃⼰的问题1.⾸先是对vs2017这款软件的使⽤1.VS中的scanf()这个函数的使⽤问题 直到这次写代码我才知道VS中⽤scanf是会被警告的,VS中正规的类似于scanf()函数的输⼊函数是scanf_s()只有使⽤这个函数你才不会报错,它有三个参分别是数据类型,地址,最⼤存储量, 还有两种⽅法1. 第⼀在代码的第⼀⾏加上“#define _CRT_SECURE_NO_WARNINGS”。
2. 或者修改⽂件属性也可以做到和上⾯⼀样的效果 右键点击源⽂件, 点击属性依次选中:C/C++ >> 预处理器,在右侧预处理器定义右侧添加上:_CRT_SECURE_NO_DEPRECATE2.第⼆就是我的知识了,真的好菜1. while()括号中的是循环条件,⽽不是停⽌条件,请⼀定要想好循环条件是啥2. 我本来以为%s输⼊有⼀个特点就是遇到空格就停⽌,其实这是函数scanf()函数的特点⽽不是%s的特点,如果想把空格也吞了,那就⽤gets(),还有两个函数就是getchar()和getch()3. 还有就是写代码的习惯很不好,总是思路混乱,不知道接下来⼲啥,其实应该,想着写着,就像翻译⼀样,把你的想法,思路,⽤代码翻译下来4. 对算法原理思想理解的不够,不重视思想原理,循环列表的原理最重要的就两个(front + 1)% maxsize 和(rear + 1) %maxsize,我感觉5. 只是太薄弱,尤其是在数组的形参表那⾥,要去补补了,传递的是⼀个地址,怎么写才好,是 status inqueue(queue all[],&man)还是 status inqueue(queue all,&man)呢?我不是很清楚,最后我⽤了前者对了,但我不知道为啥6. void inqueue(person all[], queue &man, queue &woman,int n) {//根据性别分别如男队和⼥队for (int i = 0; i < n; i++) {if (all[i].sex == 1) {//strcpy(man.elem[man.number], all[i].name);strcpy(man.elem[man.rear], all[i].name);man.rear = (man.rear + 1) % 100;man.number++;}else {//strcpy(woman.elem[woman.number], all[i].name);strcpy(woman.elem[woman.rear], all[i].name);woman.rear = (woman.rear + 1) % 100;woman.number++;}}}下⾯就是我这次写的代码,很low,很菜,哎,我太菜了。
20道队列面试题
20道队列面试题
以下是20道关于队列的面试题:
什么是队列?它有哪些基本操作?
队列在计算机科学中的用途是什么?
请解释一下队列的FIFO(先进先出)特性。
如何实现队列?你可以使用任何编程语言来给出一个简单的队列实现例子。
什么是队列的空和满条件?
如何在队列为空的时候进行出队操作?
如何在队列已满的情况下进行入队操作?
如何判断一个队列是否为空?
如何判断一个队列是否已满?
为什么我们通常使用链表来实现队列而不是数组?
什么是循环队列?它与普通队列有何不同?
循环队列在实际应用中有什么优势?
什么是队列的头部和尾部?
什么是队列的头部元素和尾部元素?
什么是队列的入队操作和出队操作?
在队列中查找元素的操作复杂度是多少?
如何实现队列的初始化?
如何删除队列中的元素?
如何添加元素到队列的末尾?
如何遍历一个队列?
以上问题可以考察应聘者对队列的理解和实现,以及在具体编程中的运用能力。
数据结构舞伴问题课程设计
数据结构舞伴问题课程设计一、课程目标知识目标:1. 理解舞伴问题在数据结构中的背景及应用,掌握其基本概念与算法原理;2. 学会运用顺序表和链表两种数据结构解决舞伴问题,并掌握其优缺点;3. 能够运用所学知识,解决类似舞伴问题的其他实际应用问题。
技能目标:1. 培养学生运用数据结构解决实际问题的能力,提高编程技能;2. 培养学生分析问题、设计算法、编写程序及调试程序的能力;3. 培养学生通过合作、交流、分享等方式,提高团队协作能力。
情感态度价值观目标:1. 培养学生对数据结构的兴趣,激发学生学习算法的积极性;2. 培养学生勇于面对问题、克服困难的信心和决心,形成良好的学习习惯;3. 培养学生具备解决问题的责任心和使命感,认识到数据结构在信息技术领域的重要作用。
分析课程性质、学生特点和教学要求,本课程目标旨在让学生掌握舞伴问题及相关数据结构知识,培养其编程技能和团队协作能力。
通过本课程的学习,学生能够运用所学知识解决实际问题,提高自身综合素质,为未来的学习和发展打下坚实基础。
二、教学内容本课程以《数据结构》教材中舞伴问题相关章节为基础,组织以下教学内容:1. 舞伴问题背景介绍:阐述舞伴问题的实际应用场景,使学生了解其在信息技术领域的意义。
2. 数据结构基本概念:回顾线性表、顺序表和链表等基本数据结构,为解决舞伴问题打下基础。
3. 舞伴问题算法原理:介绍舞伴问题的算法原理,包括配对过程、算法步骤等。
4. 顺序表和链表的应用:详细讲解如何使用顺序表和链表解决舞伴问题,分析两种方法的优缺点。
5. 编程实践:引导学生运用所学知识编写程序,解决舞伴问题,并调试优化。
6. 实例分析:分析舞伴问题在其他领域的应用,提高学生运用知识解决实际问题的能力。
教学大纲安排如下:1. 第一周:舞伴问题背景介绍,数据结构基本概念回顾;2. 第二周:舞伴问题算法原理,顺序表和链表的应用;3. 第三周:编程实践,分组讨论与交流;4. 第四周:实例分析,总结与拓展。
C语言-跳舞配对问题
C语⾔-跳舞配对问题⼀、任务⼀班有m个⼥⽣,有n个男⽣(m不等于n),现要开⼀个舞会。
男⼥⽣分别编号坐在舞池的两边的椅⼦上,每曲开始时,依次从男⽣和⼥⽣中各出⼀⼈配对跳舞, 本曲没成功配对者坐着等待下⼀曲找舞伴。
配对成功的舞伴跳完舞后排回各⾃队伍的最后。
请设计⼀系统模拟动态地显⽰出上述过程,要求输出计算任何⼀个⼥⽣(编号为X)和任意男⽣(编号为Y)第⼀次配对跳舞的舞曲编号K。
输⼊什么数据,会出现100⽀舞曲内X和Y都不能成功配对跳舞的情况?尝试⼀下。
⼆、程序分析1.男⽣和⼥⽣依次排队,排在对头的男⽣和排在对头的⼥⽣先配对,舞曲结束排到各⾃的队尾。
因此该问题具体有典型的先进先出特性,可⽤队列作为数据的存储⽅式。
2.算法需要两个队列,分别是存放男⽣队列和⼥⽣队列,每跳⼀⽀舞曲则是⼀次男⼥队列的出队列和⼊队列。
3.初始化时男⽣、⼥⽣队列的值分别为他们的编号序列。
4.解决该问题的⽅法与实验5类似,将每次配对的⼥⽣和男⽣编号与指定编号⽐较,相等则⽬前该舞曲是需要计算的舞曲。
注意舞曲的数⽬必须限制在⼀定的范围内,避免死循环。
例如在100⽀舞曲内,X和Y都没有配对跳舞,则输出不可能配对成功。
三、调试测试1.输⼊:按提⽰输⼊⼥⽣和男⽣的⼈数,以及希望配对跳舞的⼥⽣编号和男⽣编号。
6,9或者4,72.输出:X⼥⽣和Y男⽣配对跳舞成功,并且输出当前X和Y⾸次配对跳舞的舞曲序号K。
4,7第16⾸歌曲四、程序1、1 #include <stdio.h>2 #include <stdlib.h>3//#include<process.h>4#define MAX 100 //max指的是队列的最⼤长度5 typedef int DataType;6 typedef struct78 {910 DataType elem[MAX];/* 定义数组依次存放队列⾥的数据元素 */11int front ; /*指向队头元素的下标*/12int rear; /* 指向队尾元素的下⼀个空位 */1314 } Queue;1516 Queue InitQueue();17//初始化并返回⼀个空队列18void ClearQueue(Queue Q);19//清空队列Q中的元素20int IsEmpty(Queue Q);21//判断队列是否为空,返回队列或⾮空标志22int Isfull(Queue Q);23//判断是否为满,返回队列满或不满标志24 Queue InserQ(Queue Q,DataType x);25//若队列未满,将数据元素x进队列26 Queue DeleteQ(Queue Q);27//若队列⾮空,删除对头元素28 DataType GetHead(Queue Q);29//若队列⾮空,返回队列Q中的对头元素30 DataType GetRear(Queue Q);31//若队列⾮空,返回队列Q中的队尾元素3233343536373839 main()40 {4142int m,n,song;43int i,j,k,x1,x2,v1,v2;44 Queue Q1,Q2;45 printf("Input count of girls :");46 scanf("%d",&m);47 printf("Input count of boys :");48 scanf("%d",&n);49 printf("Input the songs number :");50 scanf("%d",&song);5152if (m==n||n<0||m<0)53 {54 printf("m==n||n<0||m<0 input again!\n");55 printf("Input count of girls :");56 scanf("%d",&m);57 printf("Input count of boys :");58 scanf("%d",&n);59 }6061 Q1=InitQueue();62 Q2=InitQueue();6364for(i=1; i<=m; i++)65 {66 Q1=InserQ(Q1,i);6768 }6970for(j=1; j<=n; j++)71 {72 Q2=InserQ(Q2,j);7374 }7576 v1=v2=0;77for(k=1; k<song; k++)78 {7980 x1=GetHead(Q1);81 v1=x1;82 x2=GetHead(Q2);83 v2=x2;84 Q1=DeleteQ(Q1);85 Q2=DeleteQ(Q2);86 Q1=InserQ(Q1,v1);87 Q2=InserQ(Q2,v2);8889 }9091 printf("Result:This is %d's girls and %d's boy dance!",GetHead(Q1),GetHead(Q2)); 9293 }9495 Queue InitQueue()96 {97 Queue Q;98 Q.front=Q.rear=0; //队列初始化Q.front=Q.rear=099return(Q);100 }101102 Queue InserQ(Queue Q,DataType x) //若队列未满,将数据元素x进队103 {104if ((Q.rear+1) % MAX== Q.front)105 printf("队列已满,⽆法进队");106else107 {108 Q.elem[Q.rear]=x; //x进队列109 Q.rear = (Q.rear+1) % MAX; //rear指向队尾下⼀个空位110 }111return(Q);112 }113114 Queue DeleteQ(Queue Q) //若队列⾮空,删除对头元素115 {116if (Q.rear ==Q.front)117 printf("队列是空,⽆法出队!");118else119 Q.front=(Q.front+1) % MAX;120return(Q);121 }122123 DataType GetHead(Queue Q) //若队列⾮空,去对头元素赋值给x124 {125int x;126if(Q.rear == Q.front)127 printf("队列是空的,⽆法取队头!");128else129 x=Q.elem[Q.front];130return(x);131132 }View Code2、1 #include <stdio.h>2 #include <stdlib.h>3#define MAX 1004//max指的是队列的最⼤长度5 typedef int DataType;6 typedef struct7 {89 DataType elem[MAX];/* 定义数组依次存放队列⾥的数据元素 */ 10int front ; /*指向队头元素的下标*/11int rear; /* 指向队尾元素的下⼀个空位 */1213 } Queue;1415 Queue InitQueue();16//初始化并返回⼀个空队列17void ClearQueue(Queue Q);18//清空队列Q中的元素19int IsEmpty(Queue Q);20//判断队列是否为空,返回队列或⾮空标志21int Isfull(Queue Q);22//判断是否为满,返回队列满或不满标志23 Queue InserQ(Queue Q,DataType x);24//若队列未满,将数据元素x进队列25 Queue DeleteQ(Queue Q);26//若队列⾮空,删除对头元素27 DataType GetHead(Queue Q);28//若队列⾮空,返回队列Q中的对头元素29 DataType GetRear(Queue Q);30//若队列⾮空,返回队列Q中的队尾元素3132 main()33 {3435int m,n,song;36int i,j,k,x,y,x1,x2,v1,v2;37 Queue Q1,Q2;38 printf("Input count of girls :");39 scanf("%d",&m);40 printf("Input count of boys :");41 scanf("%d",&n);42if (m==n||n<0||m<0)43 {44 printf("m==n||n<0||m<0 input again!\n");45 printf("Input count of girls :");46 scanf("%d",&m);47 printf("Input count of boys :");48 scanf("%d",&n);49 }5051 Q1=InitQueue();52 Q2=InitQueue();5354for(i=1; i<=m; i++)55 {56 Q1=InserQ(Q1,i); //对队列Q1进⾏赋值5758 }5960for(j=1; j<=n; j++)61 {62 Q2=InserQ(Q2,j); ////对队列Q2进⾏赋值6364 }6566 printf("Input number of girls :");67 scanf("%d",&x);68 printf("Input number of boys :");69 scanf("%d",&y);7071if (x>m||y>n)72 {73 printf("x>m||y>n input again!\n");74 printf("Input number of girls :");75 scanf("%d",&x);76 printf("Input number of boys :");77 scanf("%d",&y);78 }7980 song=1;8182do83 {84 v1=v2=0;85 x1=GetHead(Q1); //取队头Q186 v1=x1;87 x2=GetHead(Q2); //取队头Q288 v2=x2;89 Q1=DeleteQ(Q1); //删除队头Q190 Q2=DeleteQ(Q2); //删除队头Q291 Q1=InserQ(Q1,v1); //返回队尾Q192 Q2=InserQ(Q2,v2); //返回队尾Q293 song++;94 }95while(GetHead(Q1)!=x||GetHead(Q2)!=y);96 printf("Result:This is %d's girls and %d's boy dance!song's number:%d",x,y,song); 9798 }99100 Queue InitQueue()101 {102 Queue Q;103 Q.front=Q.rear=0; //队列初始化Q.front=Q.rear=0104return(Q);105 }106107 Queue InserQ(Queue Q,DataType x) //若队列未满,将数据元素x进队108 {109if ((Q.rear+1) % MAX== Q.front)110 printf("队列已满,⽆法进队");111else112 {113 Q.elem[Q.rear]=x; //x进队列114 Q.rear = (Q.rear+1) % MAX; //rear指向队尾下⼀个空位115 }116return(Q);117 }118119 Queue DeleteQ(Queue Q) //若队列⾮空,删除对头元素120 {121if (Q.rear ==Q.front)122 printf("队列是空,⽆法出队!");123else124 Q.front=(Q.front+1) % MAX;125return(Q);126 }127128 DataType GetHead(Queue Q) //若队列⾮空,去对头元素赋值给x129 {130int x;131if(Q.rear == Q.front)132 printf("队列是空的,⽆法取队头!");133else134 x=Q.elem[Q.front];135return(x);136137 }View Code。
队列的基本操作应用---舞伴问题(数据结构实验项目三)
队列的基本操作应⽤---舞伴问题(数据结构实验项⽬三)课程名称:数据结构实验⽬的:1.掌握队列的定义及实现;2.掌握利⽤队列的基本操作。
实验要求:1、使⽤链式结构完成队列的各种基本操作;2、补充完善教材81页的舞伴问题。
实验项⽬名称:队列的基本操作应⽤实验过程:1、先建⽴⼀个舞者队列,依次往队列中添加⼈员信息(8个⼈,5男3⼥);2、分别创建男⼥队列;3、从舞者队列中依次将队⾸元素出队并判断其性别并添加⾄男队(5⼈)或⼥队(3⼈);4、分别从男队和⼥队出队队⾸元素并配对输出;(男队⼥队分别3⼈)5、将未完成的⼀队队⾸元素输出(男队的队⾸成员名称)。
实验报告中给出算法3.23的代码实验结果:输⼊:8⼈信息(A,B,C,D,E,F,G,H)输出:The dancepartners:A---BC---DE---FG is waiting for a partner.实验分析:1.队列的操作特点;2.列举调试运⾏过程中出现的错误并分析原因。
要求:(1) 程序要添加适当的注释,程序的书写要采⽤缩进格式。
(2) 程序要具在⼀定的健壮性,即当输⼊数据⾮法时,程序也能适当地做出反应。
(3) 程序要做到界⾯友好,在程序运⾏时⽤户可以根据相应的提⽰信息进⾏操作。
(4) 上传源程序到课堂派。
顺序表的源程序保存为dancepartner.cpp。
程序代码:#include<stdio.h>#define MAXQSIZE 100#define QueueSize 20#define OK 1#define ERROR 0#define OVERFLOW 0#include <cstdlib>#include<iostream>using namespace std;typedef char QElemType;typedef int Status;//typedef char SElemType;typedef struct{char name[QueueSize];char sex;}person;typedef struct{person *dancer;person *base; //存储空间的基地址int front; //头指针int rear; //尾指针}SqQueue;Status InitQueue(SqQueue &Q){//构造⼀个空队列QQ.base=new person[MAXQSIZE]; //为队列分配⼀个最⼤容量为MAXQSIZE的数组空间if(!Q.base) exit(OVERFLOW); //存储分配失败Q.front=Q.rear=0; //头指针和尾指针为零,队列为空return OK;}Status EnQueue(SqQueue &Q,person e){//插⼊元素e为Q的新的队尾元素if((Q.rear+1)%MAXQSIZE==Q.front) //尾指针在循环意义上加1后等于头指针,表明队满return ERROR;Q.base[Q.rear]=e; //新元素插⼊队尾Q.rear=(Q.rear+1)%MAXQSIZE; //队尾指针加1return OK;}int QueueEmpty(SqQueue &Q){if (Q.front==Q.rear) return OK;else return ERROR;}Status DeQueue(SqQueue &Q,person &e){//删除Q的队头元素,⽤e返回其值if(Q.front==Q.rear) return ERROR; //队空e=Q.base[Q.front]; //保存队头元素Q.front=(Q.front+1)%MAXQSIZE; //队头指针加1return OK;}person GetHead(SqQueue Q){//返回Q的队列元素,不修改队头指针if(Q.front!=Q.rear) //队列⾮空return Q.base[Q.front]; //返回队头元素的值,队头指针不变}void DancePartner(person dancer[],int num){//结构数组dancer中存放跳舞的男⼥,num是跳舞的⼈数person p;int i;SqQueue Mdancers,Fdancers;InitQueue(Mdancers); //男⼠队列初始化InitQueue(Fdancers); //⼥⼠队列初始化for (i=0;i<num;i++) //根据性别依次将跳舞的⼈插⼊相应队列{p=dancer[i];if (p.sex=='F') EnQueue(Fdancers,p); //插⼊男队else EnQueue(Mdancers,p); //插⼊⼥队}cout<<"The dancing partner are:\n";while(!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers)){//依次输出男⼥舞伴的姓名DeQueue(Fdancers,p); //⼥⼠出队cout<<<<""; //输出出队⼥⼠姓名DeQueue(Mdancers,p); //男⼠出队cout<<<<endl; //输出出队男⼠姓名}if (!QueueEmpty(Fdancers)) //⼥⼠队⾮空,输出队头⼥⼠的姓名{p=GetHead(Fdancers); // 取⼥队的头cout<<<<" is waiting for a partner."<<endl;}else if (!QueueEmpty(Mdancers)) //男⼠队⾮空,输出男⼠队头的姓名 {p=GetHead(Mdancers); // 取男队的头cout<<<<" is waiting for a partner."<<endl;}}int main(){int i,j;person dancer[QueueSize];cout<<"请输⼊跳舞的⼈数:";cin>>j;while(j<=0){cout<<"输⼊错误,请重新输⼊跳舞的⼈数:";cin>>j;}for(i=1;i<=j;i++){cout<<"请输⼊第"<<i<<"舞者的名字:"<<endl;cin>>dancer[i-1].name;cout<<"请输⼊第"<<i<<"个⼈的性别(F/M):"<<endl;cin>>dancer[i-1].sex;while(dancer[i-1].sex!='F'&&dancer[i-1].sex!='M'){cout<<"*******输⼊错误,请重新输⼊:\n";cout<<dancer[i-1].sex;cout<<"请输⼊第"<<i<<"个⼈的性别(F/M):"<<endl;cin>>dancer[i-1].sex;break;}}DancePartner(dancer,j);}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "stdio.h"
#define MAXSIZE 100
typedef struct
{
char name[20];
char sex; //性别,'F'表示女性,'M'表示男性}Person;
typedef struct //少用一个空间的循环队列结构{
Person data[MAXSIZE];
int front;
int rear;
}CirQueue;
void InitQueue(CirQueue *Q) //初始化队列
{
Q->front=Q->rear=0;
}
void EnQueue(CirQueue *Q,Person p) //入队{
if((Q->rear+1)%MAXSIZE==Q->front)
{
printf("队满!\n");
return;
}
Q->data[Q->rear]=p;
Q->rear=(Q->rear+1)%MAXSIZE;
}
Person DeQueue(CirQueue *Q) //出队
{
Person p;
// if(Q->front==Q->rear)
// {
// printf("空队列!\n");
// return NULL;
// }
p=Q->data[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return p;
}
int QueueEmpty(CirQueue *Q) //判队列是否为空
{
if(Q->front==Q->rear) return 1;
else return 0;
}
Person QueueFront(CirQueue *Q) //读队头元素
{
return Q->data[Q->front];
}
int count(CirQueue Q) //统计循环队列中元素的个数
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
void DancePartner(Person dancer[],int num) //舞伴配对
{
//结构数组dancer中存放跳舞的男女,num是跳舞的人数。
int i;
Person p;
CirQueue Mdancers,Fdancers;
InitQueue(&Mdancers);//男士队列初始化
InitQueue(&Fdancers);//女士队列初始化
for(i=0;i<num;i++)
{
//依次将跳舞者依其性别入队
p=dancer[i];
if(p.sex=='F')
EnQueue(&Fdancers,p); //排入女队
else
EnQueue(&Mdancers,p); //排入男队
}
printf("舞伴组合如下: \n \n");
while(!QueueEmpty(&Fdancers)&&!QueueEmpty(&Mdancers)) {
//依次输入男女舞伴名
p=DeQueue(&Fdancers); //女士出队
printf("%s ",);//打印出队女士名
p=DeQueue(&Mdancers); //男士出队
printf("%s\n",); //打印出队男士名
}
if(!QueueEmpty(&Fdancers))
{
//输出女士剩余人数及队头女士的名字
printf("\n 还有%d 女士正在等待下一轮舞曲。
\n",count(Fdancers));
p=QueueFront(&Fdancers); //取队头
printf("%s 是下一轮舞曲的第一位。
\n",);
}
else
if(!QueueEmpty(&Mdancers))
{
//输出男队剩余人数及队头者名字
printf("\n 还有%d 男士正在等待下一轮舞曲。
\n",count(Mdancers));
p=QueueFront(&Mdancers);
printf("%s 是下一轮舞曲的第一位。
\n",);
}
}
main()
{
Person dancer[MAXSIZE];
int num,i;
printf("请输入人数:");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("姓名:");
scanf("%s",dancer[i].name);
getchar();
printf("性别:");
scanf("%c",&dancer[i].sex);
}
DancePartner(dancer,num);
}。