线性结构,顺序表

关于线性结构要了解以下几个方面:

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));
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值