线性表(1)
程序员文章站
2023-12-23 12:42:46
...
线性表的内容,我打算分成两部分来写,一部分是顺序存储,一部分是链式存储。
数组是实现数据存储结构的基础,不过这部分内容比较简单,我就不写了。
下面是顺序存储的主要内容,顺序表。
public class SeqList<T> extends Object
{
protected Object[]element; //对象数组存储顺序表的数据元素,保护成员
protected int n; //顺序表元素个数
public SeqList(int length); //构造容量为length的空表
public SeqList(); //构造默认容量的空表
public SeqList(T[] values); //构造顺序表,由value数组提供元素
public SeqList(SeqList<T> list); //拷贝构造函数
public boolean isEmpty(); //检验表是否为空
public int size(); //返回表的长度
public T get(int i); //返回第i个元素
public void set(int i,T x); //设置第i个元素为x
public String toString(); //返回顺序表所有元素的描述字符串
}
以上就是顺序表的大致框架,顺序表说白了就是一个功能更加强大的数组,它的存取方式与数组无异。 这里有一个约瑟夫(Josephus)环问题:古代某法官要判决number个犯人的死刑,他有一条荒唐的法律,将犯人站成一个圈,从第start个人开始暑期,每数到第distance个犯人,就拉出来处决,然后再从下一个开始数distance个,数到的人再处决,......,直到剩下最后一个犯人予以赦免。当number = 5,start=0,distance = 2时,用代码描述。
public class Josephus
{
public Josephus(int number,int start,int distance)
{
System.out.print("Josephus("+number+","+start+","+distance+"),");
SeqList<String> list = new SeqList<String>(number);
for(int i=0;i<number;i++)
list.insert((char)('A'+i)+""); //顺序表尾插入
System.out.println(list.toString());
int i=start;
while(list.size()>1)
{
i=(i+distance-1)%list.size();
System.out.print("删除"+list.remove(i).toString()+",");
System.out.println(list.toString());
}
System.out.println("被赦免者是"+list.get(0).toString());
}
public static void main(String args[]){new Josephus(5,0,2);}
}
其实,这个问题不难理解,也不难解决。