您的位置:首页 > 编程语言 > Java开发

线性表应用_约瑟夫环问题

2017-11-01 22:16 316 查看

Josephus问题:

Josephus环问题:古代某法官要判决number个犯人的死刑,他有一条荒唐的法律,
将犯人围成一个圈,从第start个人开始数,每数到第distance个犯人
就拉出来处决,然后从下一个人开始数,在数distance个,数到的人在处决
直到剩下最后一个人,赦免释放

线性表类代码:

public class SeqList<T> extends Object
{
//变量
protected Object[] element;//对象数组存储顺序表的数据元素,保护成员
protected int n;//element数组的实际元素个数

//第一种构造方法
public SeqList(int length)
{
//创建长度为length的线性表
this.element = new Object[length];//申请数组的存储空间,元素为null
this.n = 0;//元素长度为0
}
//返回线性表第i个元素
public T get(int i)
{
//若i在数组索引范围内,则返回数组element[i],否则返回null
if(i>=0 && i< this.n)
return (T)element[i];
//执行过return语句后跳出当前方法,不存在顺序执行
return null;
}

//返回顺序表中所有元素的描述字符串,覆盖Object类的toString方法
public String toString()
{
//返回格式:类名+(数据元素的字符串描述)
String str;
str = this.getClass().getName()+"(";
if(this.n>0)
str += element[0].toString();
for(int i=1; i<this.n; i++)
str += ","+element[i].toString();
return str +")";
}

//将数据 x 插入到数组element的第 i个位置,并返回插入的位置i
public int insert(int i,T x)
{
if(x == null)
throw new NullPointerException("x == null");
//默认置于顺序表第一个位置
if(i<0)
i = 0;
//不报异常,朝如到数组最后位置
if(i>this.n)
i = this.n;
Object[]source = this.element;
//用途,中间变量,用于存放原来数组
//将原来数组扩充后,重新赋值
if(this.n == element.length)
{
//将原来数组容量扩充一倍
this.element = new Object[source.length*2];
//将位置 i 以前的数组先存入新的数组
for(int j=0; j<i; j++)
this.element[j] = source[j];
}
//将i之后的数组存入新的数组
for(int j = this.n-1; j>=i; j--)
this.element[j+1] = source[j];
//将 x 嵌入数组中
this.element[i] = x;
this.n++;//线性表长度增加
return i;
}

//删除第i个位置的元素,并返回被删除的元素
public T remove(int i)
{
//分为两部分,若i在数组索引范围内,删除元素,并返回,否则返回空
if(i>=0 && i<this.n)
{
//操作部分,将i+1至末尾元素向前移动覆盖原有元素,最后将最后一个元素值为null
T old = (T)this.element[i];//将第i个元素进行T类型转换
for(int j=i; j<this.n-1; j++)
{
this.element[j] = this.element[j+1];
}
this.element[this.n-1] = null;
this.n--;//删除后,元素个数减一
return old;
}
return null;
}

}


主类代码:

public class Josephus
{
protected int number;
protected int start,distance;
public Josephus(int number,int start,int distance)
{
this.number = number;
this.start = start;
this.distance = distance;
}
public void deal()
{
SeqList<String> list = new SeqList<String>(number);
for(int i=0; i<number; i++)
{
//坑,在插入元素时,不能调用set方法,因为对象数组只是创建了
//还未初始化,此时访问,任何一个成员都是数组越界
list.insert(i,(char)('A'+i)+"");
}
//将字符A至字符E插入到线性表中
System.out.println("Josephus问题:\n"+list.toString());
//犯人的初识位置是start
int i = start;
//处决犯人
//remove犯人
while(list.size()>1)
{
i = (i+distance-1)%list.size();
System.out.println("处决:"+list.remove(i)+",待处决"+list.toString());
}
System.out.println("赦免:"+list.toString());
}

public static void main(String args[])
{
Josephus josephus = new Josephus(5,0,2);
josephus.deal();
}
}

运行结果:

Josephus问题:

SeqList(A,B,C,D,E)

处决:B,待处决:SeqList(A,C,D,E)

处决:D,待处决:SeqList(A,C,E)

处决:A,待处决:SeqList(C,E)

处决:E,待处决:SeqList(C)

赦免:SeqList(C)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐