顺序表属于线性表的一种实现。
线性表 ADT
一般有这些:
-
求元素个数
-
插入
-
删除
-
查找
-
判断是否为空
根据这个我们设计一个抽象的线性表接口 :
/**
* Author/Date: venjerLu / 2017/1/6 14:41
* Email: alwjlola@gmail.com
* Description: 线性表抽象数据类型接口
*/
public interface MyList<T> {
/**
* 获得线性表的长度
*/
int size();
/**
* 判断线性表是否为空
*/
boolean isEmpty();
/**
* 在指定位置插入元素
*
* @param index 元素索引
* @param obj 元素实例
*/
void insert(int index, T obj) throws Exception;
/**
* 删除指定的元素
*
* @param index 元素的索引
*/
void delete(int index) throws Exception;
/**
* 得到指定的元素
*
* @param index 元素的索引
* @return Object
*/
T get(int index) throws Exception;
/**
* 在最后一位插入
* @param t 元素
*/
void add(T t) throws Exception;
}
复制代码
顺序表的实现
**
* Author/Date: venjerLu / 2017/1/6 14:48
* Email: alwjlola@gmail.com
* Description: 顺序表的实现
*/
public class SequenceList<T> implements MyList<T> {
private final int defaultSize = 10; // 默认顺序表的长度
private int maxSize; // 最大长度
private int size; // 当前长度
private T[] elements; // 元素数组
public SequenceList() {
init(defaultSize);
}
public SequenceList(int maxSize) {
init(maxSize);
}
/**
* 初始化顺序表
*
* @param size 最大长度
*/
@SuppressWarnings("unchecked") private void init(int size) {
maxSize = size;
this.size = 0;
elements = (T[]) new Object[maxSize];
}
@Override public int size() {
return size;
}
@Override public boolean isEmpty() {
return size == 0;
}
@Override public void insert(int index, T obj) throws Exception {
if (size == maxSize) {
// TODO: 2017/1/6 动态增加数组的大小
throw new Exception("顺序表已满,无法插入");
}
if (index < 0 || index > size) {
throw new Exception("index 非法");
}
// 从 index 开始所有的元素往后一位, 从表尾开始遍历
for (int j = size - 1; j >= index; j++) {
// 将前一个值赋值给后一位
elements[j + 1] = elements[j];
}
elements[index] = obj;
size++;
}
@Override public void delete(int index) throws Exception {
if (isEmpty()) {
throw new Exception("书序表为空,无法删除");
}
if (index < 0 || index > size) {
throw new Exception("index 非法");
}
// 从 index 开始所有的元素往前移一位, 从表尾开始遍历
for (int i = size - 1; i >= index; i++) {
// 将后一个元素的值赋值给前一个元素。
elements[i] = elements[i + 1];
}
elements[size - 1] = null; // 将最后一个元素值置为空。
size--;
}
@Override public T get(int index) throws Exception {
if (index < 0 || index > size) {
throw new Exception("index 非法");
}
if (isEmpty()) {
throw new Exception("list is null");
}
return elements[index];
}
@Override public void add(T t) throws Exception {
if (size == maxSize) {
// TODO: 2017/1/6 动态增加数组的大小
throw new Exception("顺序表已满,无法插入");
}
elements[size] = t;
size++;
}
}
复制代码