数据结构实现舞会男女分配问题(Java版)
为什么写一个Java数据结构来解决舞会问题呢?
- 在写舞会问题时,我从网上查询了绝大部分建议与思路,发现全是使用c语言写出来的,所以Java和c语言同时为计算机语言,但c语言指针的连通性是Java所不具备的。由于我的专业是专攻Java,因此想写一个关于舞会问题的Java数据结构代码。(由于自身的知识可能掌握的不全面,大佬勿喷)
- 下面我先把题目呈现给大家:
- 利用循环队列模拟舞伴配对问题。在舞会上,男、女各自排成一队。舞会开始时。依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。
2. 假设初始男、女人数及性别已经固定,舞会的轮数从键盘输入。
试模拟解决上述舞伴配对问题。
3.从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名。
- 大家来看这个题,题目的要求是让我们用循环队列来解决问题,解决什么问题呢?
看一下第二点,男女人数不等,我们要解决的男女舞伴分配问题,即第一轮没有跳舞的男生或者女生将在下一轮先上场去和另一队的对头相匹配。 - 思路:求出男女生较少的那一队,以这个为最小量,每首歌曲都将以这个最小量上场,每次上场时队头先出队,然后对头再入队,我们只需要提供每次歌曲的数量就可以轻松的解决了。
- 我相信大家都有了一定的思路对不对,接下来我们就可以进行代码编写了。先提供代码及说明如下:
我们先定义一个队列的接口 Queue,里面包含了队列的一些基本方法:
public interface Queue<T>{ //队列接口,描述队列抽象数据类型,T表示数据元素的数据类型
public abstract boolean isEmpty(); //判断队列是否空
public abstract boolean add(T x); //元素x入队,若添加成功,则返回true;否则返回false
public abstract T peek(); //返回队头元素,没有删除。若队列空,则返回null
public abstract T poll(); //出队,返回队头元素。若队列空,则返回null
}
然后我们创建一个顺序队列SeqQueue,来继承刚才的接口实现它的方法来对队列元素进行一些操作
public final class SeqQueue<T> implements Queue<T>
{
private Object element[]; //存储队列数据元素的数组
private int front, rear; //front、rear分别为队列头尾下标
public SeqQueue(int length) //构造容量为length的空队列
{
if (length<64)
length=64; //设置队列数组容量最小值
this.element = new Object[length];
this.front = this.rear = 0; //设置空队列
}
public SeqQueue() //构造默认容量的空队列
{
this(64);
}
public boolean isEmpty() //判断队列是否空,若空返回true
{
return this.front==this.rear;
}
public boolean add(T x) //元素x入队,空对象不能入队
{
if (x==null)
return false;
if (this.front==(this.rear+1)%this.element.length) //若队列满,则扩充数组
{
Object[] temp = this.element;
this.element = new Object[temp.length*2]; //重新申请一个容量更大的数组
int j=0;
for (int i=this.front; i!=this.rear; i=(i+1) % temp.length) //按照队列元素次序复制数组元素
this.element[j++] = temp[i];
this.front = 0;
this.rear = j;
}
this.element[this.rear] = x;
this.rear = (this.rear+1) % this.element.length;
return true;
}
@SuppressWarnings("unchecked")
public T peek() //返回队头元素,没有删除。若队列空,则返回null
{
return this.isEmpty() ? null : (T)this.element[this.front];
}
public T poll() //出队,返回队头元素,若队列空返回null
{
if (this.isEmpty())
return null;
@SuppressWarnings("unchecked")
T temp = (T)this.element[this.front];
this.front = (this.front+1) % this.element.length;
return temp;
}
public String show() {
return null;
}
public String toString() //返回队列所有元素的描述字符串,形式为“(,)”,按照队列元素次序
{
StringBuffer strbuf = new StringBuffer(" ");
for (int i=this.front; i!=this.rear; i=(i+1)%this.element.length)
strbuf.append(this.element[i].toString()+","); //按照队列元素次序复制数组元素
strbuf.setCharAt(strbuf.length()-1, ' '); //将串最后多余的一个字符','改为')'
return new String(strbuf); //由StringBuffer对象构造String对象
}
}
接着我们就可以编写实现舞会问题的方法了,因为老师讲过,凡是方法什么的可以放在一个类里,和主类分别开来,所以我又新建了一个类Soluation,来存放关于舞会问题的具体方法:
import java.util.Scanner;
public class Soluation extends SeqQueue_ex {
//定义男女生数量
int boys_number = 4;//男生数量
int girls_number = 5;//女生数量
public void ex() {
// 初始化男女生队列,将男女生分别加入男女生队列中
Queue<Integer> boys = new SeqQueue<Integer>();
for (int i=1; i<=boys_number;i++) {
boys.add(i);
}
Queue<Integer> girls = new SeqQueue<Integer>();
for (int i=1; i<=girls_number;i++) {
girls.add(i);
}
// 跳舞开始
int number=boys_number>girls_number?girls_number:boys_number;
Scanner sc =new Scanner(System.in);
System.out.println("请输入乐曲的数目:");
int k = sc.nextInt();
for(int i=1;i<=k;i++) {
System.out.println("正在进行第 " +i+ " 首曲子:");
for (int j = 0; j < number; j++) {
// 跳舞,第一个问题:输出每曲配对情况
System.out.println("Boy"+boys.peek()+"和 Girl "
+ girls.peek()+" 在跳舞");
// 跳过的排到对尾
int boy = boys.poll();
boys.add(boy);
int girl = girls.poll();
girls.add(girl);
}
}
}
}
最后,我们只需要调用这个方法就可以实现了,我们将这个调用目标方法的类命名为SeqQueue_ex:
import java.util.Scanner;
public class SeqQueue_ex {
public static void main(String[] args) {
Soluation solu = new Soluation();
solu.ex();
}
}
这样我们就实现了舞会问题,我相信大家都可以看懂。
大家也可以直接下载舞会问题的源码:网址附上:
Java数据结构实现舞会分配问题下载
谢谢阅读。
本文介绍如何使用Java数据结构解决舞会男女分配问题。通过定义队列接口Queue和实现顺序队列SeqQueue,结合循环队列解决当男女人数不等时的配对策略。具体实现包括在SeqQueue_ex类中调用解决方案类Soluation的方法,从而完成舞伴配对的模拟。

475

被折叠的 条评论
为什么被折叠?



