什么是顺序表
顺序表就是顺序存储的线性表,其各元素之间存储地址是连续的(物理和逻辑上都相邻)。
顺序表的特点
1、元素逻辑上和物理上都相邻。其分配的地址是连续的,故而其元素的存储地址都是相邻的。
2、便于随机访问。
因为是相邻的内存,并且每个元素的类型相同,所以每个元素所占空间大小一样,访问时只需要去计算:起始地址 + 元素位置 X 每个元素大小 即可得到需访问元素的起始地址了。
比如我分配了100字节的大小给顺序表,每个元素占20字节,那么假设该顺序表起始地址为1,末尾地址为100,访问下表为2的元素,只需要计算 0+20*2 = 40 就是第二个元素的存储位置的头部了。
3、初始化时需要分配较大连续的内存。
4、插入、删除操作需要移动后面的元素,代价较大。
简单实现
先写一个接口,后续还可以使用链表实现。
public interface IList {
//置空
public void clear();
//获取元素个数
public int length();
//判空
public boolean isEmpty();
//获取指定元素
public Object get(int i);
//新增元素
public void add(Object o);
//指定位置插入元素
public void insert(int index,Object o);
//移除元素
public void remove(int i);
//查找对应元素下标
public int indxeOf(Object o);
//输出所有元素
public void display();
}
顺序表具体实现
public class SqList implements IList {
//以泛型存储对象存储
private Object[] list;
//当前存储到的位置
private int curLenght;
/**
* @description 构造方法
* @author 三文鱼
* @date 21:57 2022/3/2
* @param maxSize
* @return {@link }
**/
public SqList(int maxSize) {
list = new Object[maxSize];
curLenght = 0;
}
@Override
public void clear() {
curLenght = 0;
}
@Override
public int length() {
return curLenght;
}
@Override
public boolean isEmpty() {
return curLenght == 0;
}
@Override
public Object get(int i) {
return null;
}
@Override
public void add(Object o) {
if(curLenght == list.length) {
System.out.println("顺序表已满。");
}else{
list[curLenght] = o;
curLenght++;
System.out.println("新增成功。");
}
}
@Override
public void insert(int index, Object o) {
//判断插入操作是否可执行
if(curLenght == list.length)
System.out.println("顺序表已满 ");
if(index < 0 || index > list.length)
System.out.println("插入位置不合法 ");
//元素后移
for(int j = curLenght; j > index; j--) {
list[j] = list[j - 1];
}
//插入元素
list[index] = o;
//表长加一
curLenght++;
System.out.println("指定位置:"+ index + " 插入成功。");
}
@Override
public void remove(int i) {
if(i > curLenght) {
System.out.println("移除位置不存在元素。");
}else if(i < 0 || i >= list.length) {
System.out.println("移除位置不合法。");
}else if(list[i] != null) {
//当前位置的元素不为空
for(int j = i; j < curLenght - 1; j++) {
list[j] = list[j + 1];
}
if(curLenght > 0)
curLenght--;
System.out.println("移除第 " + i +" 位成功。");
}else {
System.out.println("移除位置上没有元素。");
}
}
@Override
public int indxeOf(Object o) {
if(curLenght == 0) {
return -1;
}
int i = 0;
for (Object in: list) {
if(in.equals(o)){
return i;
}
i++;
}
return -1;
}
@Override
public void display() {
if(curLenght != 0) {
for(int j = 0; j < curLenght; j++)
System.out.print(list[j] + " ");
System.out.println("");
}else
System.out.println("数据为空。");
}
}