关于线性结构要了解以下几个方面:
1.线性结构
2.线性表抽象数据类型
3.顺序表
4.顺序表应用
线性结构定义:
如果一个数据元素序列满足:
1.除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素;
2.第一个数据元素没有前驱数据元素;
3.最后一个数据元素没有后继数据元素。
则称这样的数据结构为线性结构
线性表抽象数据类型
线性表抽象数据类型主要包括两个方面: 既数据集合和该数据集合上的操作集合。
数据集合可以表示为a0,a1,a2…an-1,每个数据元素的数据类型可以是任意的类型
操作集合包括如下:
1.求元素个数 2. 插入 3.删除 4.查找 5.判断是否为空
// 线性表接口
public interface List {
// 获得线性表长度
public int size();
// 判断线性表是否为空
public boolean isEmpty();
// 指定索引插入元素
public void insertIndex(int index, Object obj) throws Exception;
// 不指定索引插入元素
public void insert(Object object) throws Exception;
// 指定删除元素
public void delete(int index) throws Exception;
// 获取指定位置的元素
public Object get(int index) throws Exception;
}
顺序表
计算机有两种基本的存储结构:顺序结构、离散结构。使用顺序表结构实现的线性表称为顺序表。
// 顺序表类
public class SequenceList implements List {
// 默认顺序表的长度
final int defaultSize = 10;
// 顺序表对打长度
int maxSize;
// 当前长度
int size;
// 对象数据
Object[] listArray;
public SequenceList() {
init(defaultSize);
}
public SequenceList(int size) {
init(size);
}
// 顺序表初始化长度
private void init(int size) {
maxSize = size;
this.size = 0;
listArray = new Object[size];
}
@Override
public int size() {
return this.size;
}
@Override
public boolean isEmpty() {
return this.size == 0;
}
@Override
public void insertIndex(int index, Object obj) throws Exception {
// 线性表已满
if (size == maxSize) {
throw new Exception("顺序表已满,无法插入!");
}
// 插入位置编号是否合法
if (index < 0 && index > maxSize) {
throw new Exception("索引参数错误!");
}
// 移动元素 从后向前移动
for (int j = size; j > index; j--) {
listArray[j] = listArray[j - 1];
}
// 讲元素插入
listArray[index] = obj;
size++;
}
@Override
public void insert(Object object) throws Exception {
// 线性表已满
if (size == maxSize) {
throw new Exception("顺序表已满,无法插入!");
}
listArray[size] = object;
size++;
}
@Override
public void delete(int index) throws Exception {
if (isEmpty()) {
throw new Exception("顺序表为空,无法删除!");
}
if (index < 0 && index > size - 1) {
throw new Exception("索引参数错误!");
}
// 移动元素
for (int j = index; j < size - 1; j++) {
listArray[j] = listArray[j + 1];
}
size--;
}
@Override
public Object get(int index) throws Exception{
if (index < 0 && index >= size) {
throw new Exception("索引参数错误!");
}
return listArray[index];
}
}
Test
public static void main(String[] args) throws Exception {
SequenceList list = new SequenceList(20);
list.insertIndex(0, 100);
list.insert(200);
list.delete(1);
for (int i = list.size; i > 0; i--) {
System.out.println(list.get(i-1));
}
}
顺序表效率分析
顺序表插入和删除一个元素的时间复杂度为O(n).
顺序表支持随机访问,顺序表读取一个元素的时间复杂度为O(1).
顺序表的优点是:支持随机访问,空间利用率高。
顺序表的缺陷是:大小固定,插入和删除元素需要移动大量的数据。
顺序表的应用
设计一个顺序表,用来保存学生资料
要完成这个只需要再设计一个学生类就行了
// 学生类
public class Students {
// 学号
private String sid;
// 性名
private String name;
// 性别
private String gender;
// 年龄
private int age;
public Students(){}
public Students(String sid, String name, String gender, int age) {
this.sid = sid;
this.name = name;
this.gender = gender;
this.age = age;
}
@Override
public String toString() {
return "Students{" +
"sid='" + sid + '\'' +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
'}';
}
...getter.setter...
}
Test
public static void main(String[] args) throws Exception {
SequenceList list = new SequenceList(20);
list.insert(new Students("S0001","张三","男",18));
list.insert(new Students("S0002","李四","男",19));
list.insert(new Students("S0003","王五","女",20));
for (int i =0; i < list.size; i++) {
System.out.println(list.get(i));
}
}