线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。线性表可通过一维数组来实现其顺序存储结构,即把第一个数据元素存放到数组下标为0的位置中,接着把线性表相邻的元素存储到数组中相邻的位置。
顺序存储结构的优缺点:
优点:1. 无需为表中元素之间的逻辑关系而增加额外的存储空间
2. 可以快速地存取表中任意位置的元素
缺点:1. 插入和删除需要移动大量元素
顺序存储结构需要三个属性:
1. 存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。
2. 线性表的最大存储容量: 来决定数组的长度。在任意时刻,线性表的长度都应小于等于数组的长度。
3. 线性表的当前长度。
public class ArrayList<E> {
private Object[] data; // 保存线性表数据的数组
private int capacity; // 线性表目前的容量
private int size; // 线性表的元素个数
/**
* 初始化未声明大小,声明为10
*/
public ArrayList() {
this(10);
}
/**
* 初始化线性表,声明数组的大小
* @param initSize 线性表的初始化大小
*/
public ArrayList(int initSize) {
if (initSize >= 0) {
data = new Object[initSize];
capacity = initSize;
size = 0;
} else {
throw new RuntimeException("初始化大小不能小于0: " + initSize);
}
}
/**
* 判断当前线性表是否为空
* @return
*/
public boolean isEmpty() {
if (size > 0) {
return false;
} else {
return true;
}
}
/**
* 返回当前线性表的大小
* @return
*/
public int capacity() {
return size;
}
/**
* 清空当前线性表
*/
public void empty() {
data = null;
capacity = 0;
size = 0;
}
/**
* 末位添加新元素
* @param e 元素e
*/
public boolean add(E e) {
validatecp();
data[size] = e;
size++;
return true;
}
/**
* 判断是否超出容量,即size是否超出capacity,如果超出则扩容
*/
private void validatecp() {
if (size == capacity) {
capacity *= 2;
Object[] temp = new Object[capacity];
for (int i = 0; i < size; i++) {
temp[i] = data[i];
}
data = temp;
}
}
/**
* 判断下标是否在正常范围内
* @param index 接收的下标参数
*/
private void validateindex(int index) {
if (index < 0 || index > size) {
throw new RuntimeException("无效的下标: " + index);
}
}
/**
* 取得某个位置元素
* @param index 下标参数
* @return
*/
public E getElement(int index) {
validateindex(index);
return (E) data[index];
}
/**
* 在指定的位置插入元素
* @param index 元素的插入位置
* @param e 元素
* @return
*/
public boolean insert(int index, E e) {
validateindex(index);
validatecp();
for (int i = size; i > index; i--) {
data[i] = data[i - 1];
}
data[index] = e;
size++;
return true;
}
/**
* 删除指定位置的元素
* @param index 待删除元素下标
* @return
*/
public boolean delete(int index) {
validateindex(index);
for (int i = index; i < size; i++) {
data[i] = data[i + 1];
}
data[size - 1] = null;
size--;
return true;
}
@Override
public String toString() {
String str = "[ ";
for (Object e : data) {
if (e != null) {
str = str + e + " ";
}
}
str = str + "]";
return str;
}
}