线性表的顺序存储结构:是指用一组地址连续的存储单元一次存放线性表的元素。为了使用顺序结构实现线性表,程序通常会采用数组来保存线性中的元素,是一种随机存储的数据结构,适合随机访问。java中ArrayList类是线性表的数组实现。
下面是自己模仿ArrayList实现的最简单的线性表的顺序存储功能
import java.util.Arrays;
//线性表的顺序存储 抽象类的实现
public class SequenceList<T> {
private int DEFAULT_SIZE = 10;
//保存数组的长度
private int capacity;
//定义一个数组用于保存顺序线性表的元素
private Object[] elementData;
//保存顺序表中元素的当前个数
private int size;
//以默认数组长度创建空顺序线性表
public SequenceList(){
capacity = DEFAULT_SIZE;
elementData = new Object[capacity];
}
//以一个初始化元素来创建顺序线性表
public SequenceList(T element){
this();
elementData[0] = element;
size++;
}
//以指定长度的数组来创建顺序线性表
public SequenceList(T element, int initSize){
capacity = DEFAULT_SIZE;
//把capacity设置为大于initSize的最小的1.5的n次方
while(capacity < initSize){
capacity = capacity + capacity >> 1;
}
elementData = new Object[capacity];
elementData[0] = element;
size++;
}
//判断顺序线性表是否为空
public boolean empty(){
return size == 0;
}
//清空线性表
public void clear(){
Arrays.fill(elementData , null);
/*等价于
for(int i=0;i<size;i++){
elementData[i] = null;
}
*/
size = 0;
}
//获取顺序线性表中索引为i处的元素
public T get(int i){
if(i<0 ||i>size-1){
throw new IndexOutOfBoundsException("线性表索引越界");
}
return (T) elementData[i];
}
//查找顺序线性表中指定元素的索引
public int locate(T element){
for(int i=0;i<size;i++){
if(elementData[i].equals(element)){
return i;
}
}
return -1;
}
//获取线性表的大小
public int length(){
return size;
}
//向顺序线性表中的指定位置插入一个元素
public void insert(T element, int index){
if(index <0 || index > size){
throw new IndexOutOfBoundsException("线性表索引越界");
}
ensureCapacity(size + 1);
//将index处以后的所有元素向后移动一格
System.arraycopy(elementData, index, elementData, index+1, size - index);
elementData[index] = element;
size++;
}
//动态增加容量
private void ensureCapacity(int minCapacity){
//如果数组原有的长度小于目前所需要的长度
if(minCapacity > capacity){
while(minCapacity > capacity){
capacity = capacity + capacity >> 1;
}
elementData = Arrays.copyOf(elementData, capacity);
}
}
//在顺序线性表的最后添加一个元素
public void add(T element){
ensureCapacity(size + 1);
elementData[size++] = element;
}
//删除顺序线性表中指定索引处的元素
public T delete(int index){
if(index < 0 || index < size){
throw new IndexOutOfBoundsException("线性表索引越界");
}
T oldValue = (T) elementData[index];
int numMoved = size -index - 1;
if(numMoved > 0)
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
//清空最后一个元素
elementData[--size] = null;
return oldValue;
}
//点出顺序线性表的最后一个元素
public T remove(){
return delete(size-1);
}
}