知识点
线性表的顺序结构存储结构简称为顺序表。
线性表逻辑顺序相邻,顺序表存储位置相邻。
便于随机存取。
删除和插入可能要移动大量元素,效率低。
解决溢出的方法是新建另一个大容量数组,效率低。
实现
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方法。
欢迎指正!