线性表是最基本的一种数据结构,它是表示一组相同类型数据的有限序列,你可以把它与数组进行参考,但是它并不是数组,线性表是一种表结构,它能够支持数据的插入、删除、更新、查询等,同时数组可以随意存放在数组中任意位置,而线性表只能依次有序排列,不能出现空隙,因此,我们需要进一步的设计。
顺序表
将数据依次存储在连续的整块物理空间中,这种存储结构称为顺序存储结构,而以这种方式实现的线性表,我们称为顺序表。
同样的,表中的每一个个体都被称为元素,元素左边的元素(上一个元素),称为前驱,同理,右边的元素(后一个元素)称为后驱。
我们设计线性表的目标就是为了去更好地管理我们的数据,也就是说,我们可以基于数组,来进行封装,实现增删改查!既然要存储一组数据,那么很容易联想到我们之前学过的数组,数组就能够容纳一组同类型的数据。
目标:以数组为底层,编写以下抽象类的具体实现
/**
* 线性表抽象类
* @param <E> 存储的元素(Element)类型
*/
public abstract class AbstractList<E> {
/**
* 获取表的长度
* @return 顺序表的长度
*/
public abstract int size();
/**
* 添加一个元素
* @param e 元素
* @param index 要添加的位置(索引)
*/
public abstract void add(E e, int index);
/**
* 移除指定位置的元素
* @param index 位置
* @return 移除的元素
*/
public abstract E remove(int index);
/**
* 获取指定位置的元素
* @param index 位置
* @return 元素
*/
public abstract E get(int index);
}
实现如下:
public abstract class LinearList<E> {
public abstract int getSize();
public abstract void add(E e, int index);
public abstract E remove(int index)throws Exception;
public abstract E get(int index) throws Exception ;
protected E[] e;
protected int max;
}
class MyList extends LinearList<Integer>{
public MyList(){
max = 0;
}
public int getSize(){
return max;
}
@Override
public void add(Integer integer, int index) {
Integer[] newArr = new Integer[max + 1];
if(e == null) {
newArr[index - 1] = integer;
this.e = newArr;
}
for(i = 0;i < e.length;i++){
newArr[i] = e[i];
}
newArr[index] = integer;
}
public Integer remove(int index) throws Exception{
if(index > max || index < 0) throw new Exception("Out of Bound");
Integer ret = e[index];
for(int i = index - 1;i < e.length - 1; i++){
if(i < max) e[i] = e[i+1];
}
max--;
return ret;
}
public Integer get(int index) throws Exception {
if(index > max || index < 0) throw new Exception("Out of Bound");
return e[index];
}
}