假定在一舞会上,男士排成一队,女士排成一队。跳舞开始时,依次从男队和女队的队头各出一人配成舞伴。若两队的初识人数不同,则较长的那一队中未配对者等待下一轮舞曲。基本要求:模拟上述舞伴系统,并能计算对于任何男士A和女士b在哪一轮舞曲中的K次跳舞。实验提示:用循环队列实现上述操作
pascal语言
1、 队列的应用--舞伴问题
问题叙述
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。
【问题分析】
先入队的男士或女士亦先出队配成舞伴。因此该问题具体有典型的先进先出特性,可用队列作为算法的数据结构。
在算法中,假设男士和女士的记录存放在一个数组中作为输入,然后依次扫描该数组的各元素,并根据性别来决定是进入男队还是女队。当这两个队列构造完成之后,依次将两队当前的队头元素出队来配成舞伴,直至某队列变空为止。此时,若某队仍有等待配对者,算法输出配对的结果和此队列中等待者的人数及排在队头的等待者的名字,他(或她)将是下一轮舞曲开始时第一个可获得舞伴的人。
【样例】
输入:BAECF
21456739
输出:B2 A1 E4 C5 F6
3 {等待人数}
7 {第1位等待者的编号}
var s1,s2:string; i,j,k:integer;
begin
readln(s1); readln(s2);
j:=length(s1); k:=length(s2);
if j>k then begin i:=j; j:=k; k:=i end;
write(s1[1],s2[1]);
for i:=2 to j do write(' ',s1[i],s2[i]);
writeln;
writeln(k-i);
if length(s1)<length(s2) then writeln(s2[j+1])
else writeln(s1[j+1]);
end.
追问可以用c语言循环队列么?
追答循环队列会有重复的配对吧