知识点
- 线性表的顺序结构存储结构简称为顺序表。
- 线性表逻辑顺序相邻,顺序表存储位置相邻。
- 便于随机存取。
- 删除和插入可能要移动大量元素,效率低。
- 解决溢出的方法是新建另一个大容量数组,效率低。
实现
List接口:
public interface MyList { boolean isEmpty(); //判断是否为空 int listLength(); //返回表的长度 void add(Object object); //添加元素 boolean delete(int index); //删除元素 boolean insert(int index, Object object); //插入元素 Object get(int index); //取表元素 int find(Object object); //查找某元素 返回索引 void display(); //输出 void clear(); //清空 }
SqList:
public class SqList implements MyList{ private Object[] data; private int length; public SqList(int maxSize) { //初始化顺序表 构造一个maxSize大小的顺序表 length = 0; data = new Object[maxSize]; } public boolean isEmpty() { // 判断是否为空 return length == 0; } public int listLength() { // 返回顺序表的长度 return length; } public void add(Object object) { //添加元素 if (length == data.length) { //如果数组已经满了 扩大两倍 resize(2*length); } data[length++] = object; } private void resize(int max) { //动态调整数组大小 Object[] temp = new Object[max]; for (int i = 0; i < length; i++) { temp[i] = data[i]; } data = temp; } public boolean delete(int index) { // 删除元素 if (length == data.length) { //满了 导致最后一个删不掉 扩充 resize(2*length); } if (index < 0 || index > length) { return false; } for (int i = index - 1; i < length; i++) { //下标从要删除的地方开始移动 每次往前移一个 data[i] = data[i+1]; } length --; return true; } public boolean insert(int index, Object object) { // 插入元素 if (length == data.length) { //满了 扩充 resize(2*length); } if (index < 0) { return false; } for (int i = length; i >= index-1; i--) { //最后开始 每个往后移一个 data[i] = data[i-1]; } data[index-1] = object; length ++; return true; } public Object get(int index) { // 得到指定位置元素 if (index < 0 || index > length) { return null; } return data[index-1]; } public int find(Object object) { // 按元素查找 int i = 0; while (i < length && !data[i].equals(object)) { i ++; } if (i >= length) { return -1; } else { return i+1; } } public void display() { // 输出顺序表 for (int i = 0; i < length; i++) { System.out.print(data[i] + " "); } System.out.println(); } public void clear() { //清空顺序表 if (length != 0) { for (int i = 0; i < length; i++) { data[i] = null; } length = 0; } } }
Test:
public class Test { public static void main(String[] args) { SqList sqList = new SqList(5); sqList.add("hello"); sqList.add("world"); sqList.add("hahah"); sqList.add("open"); sqList.add("your"); System.out.println(sqList.isEmpty()); System.out.println(sqList.listLength()); sqList.display(); if (sqList.delete(5)) { sqList.display(); } else { System.out.println("Wrong"); } if (sqList.insert(2, "what")) { sqList.display(); } else { System.out.println("Wrong"); } System.out.println(sqList.get(2)); System.out.println(sqList.find("what")); sqList.clear(); sqList.display(); } }
结果:
ps:代码中用到了算法中的1.3的resize方法。
欢迎指正!