当前位置:首页 » 《关于电脑》 » 正文

数据结构(JAVA)顺序表

25 人参与  2024年11月06日 12:40  分类 : 《关于电脑》  评论

点击全文阅读


文章目录

1. 线性表2.顺序表2.1 顺序表接口实现 3. ArrayList3.1ArrayList的构造方法3.2ArrayList的常用方法 4.ArrayList的优缺点4.1优点4.2缺点


#1024程序员节|征文#
在这里插入图片描述

1. 线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的。

2.顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,
一般情况下采用数组存储。在数组上完成数据的增删查改。
在这里插入图片描述

2.1 顺序表接口实现

我们自己先来实现顺序表(以int类型为例)

public class ArrayList {    private int[] elem;    private int usedSize;    // 默认构造方法    public ArrayList(){}    // 将顺序表的底层容量设置为initcapacity    public ArrayList(int initcapacity){}    // 新增元素,默认在数组最后新增    public void add(int data) {}    // 在 pos 位置新增元素    public void add(int pos, int data) {}    // 判定是否包含某个元素    public boolean contains(int toFind) { return true; }    // 查找某个元素对应的位置    public int indexOf(int toFind) { return -1; }    // 获取 pos 位置的元素    public int get(int pos) { return -1; }    // 给 pos 位置的元素设为 value    public void set(int pos, int value) {}    //删除第一次出现的关键字key    public void remove(int toRemove) {}    // 获取顺序表长度    public int size() { return 0; }    // 清空顺序表    public void clear() {}}//下标不合法异常  下面要使用到public class PosIllegal extends RuntimeException {    public PosIllegal() {    }    public PosIllegal(String msg) {        super(msg);    }}//空异常  下面要使用到public class EmptyException extends RuntimeException{    public EmptyException() {    }    public EmptyException(String msg) {        super(msg);    }}

2.1.1默认构造方法

我们先开辟10个数组空间。

    private static final int DEFALUT_SIZE = 10;    // 默认构造方法    public ArrayList() {        this.elem = new int[DEFALUT_SIZE];    }

2.1.2将顺序表的底层容量设置为initcapacity

传入参数,实现数组长度。

    // 将顺序表的底层容量设置为initcapacity    public  ArrayList(int initcapacity){        this.elem = new int[initcapacity];    }

2.1.3尾插
传入尾插的数据,并实行插入。
注意事项:

顺序表是否已满,如果已满就扩容。元素加一(usedSize++)。
    //判断顺序表是否满了    private boolean isFull() {        return usedSize == elem.length;    }    //顺序表扩容    private void grow() {        this.elem = Arrays.copyOf(elem,2*elem.length);    }    // 新增元素,默认在数组最后新增    public void add(int data) {        //判满 + 扩容        if(isFull()) {            grow();        }        this.elem[this.usedSize] = data;        usedSize++;    }

2.1.4在pos位置插入
传入pos下标和data数据,并在pos位置插入。
注意事项:

顺序表是否已满,如果已满就扩容。元素加一(usedSize++)。判断pos下标是否合法。一定要从末尾开始遍历到pos位置,如果从pos位置开始遍历会数据覆盖。
    //判断下标是否合法    private void getPosIsLegitimate (int pos) throws PosIllegal{        if (pos < 0 || pos >= usedSize) {            throw new PosIllegal("Pos不合法");        }    }    // 在 pos 位置新增元素    public void add(int pos, int data) {        try{            getPosIsLegitimate(pos);            //判满 + 扩容            if(isFull()) {                grow();            }            for(int i = elem.length-1;i > pos;i--) {                this.elem[i+1] = elem[i];            }            this.elem[pos] = data;            usedSize++;        }catch(PosIllegal e) {            System.out.println("pos下标不合法");            e.printStackTrace();        }    }

2.1.5判定是否包含某个元素
遍历数组,观察数组中是否包含传入的参数(toFind),如果有返回true,否则返回法false。

    // 判定是否包含某个元素    public boolean contains(int toFind) {        for(int i = 0;i < elem.length;i++) {            if(this.elem[i] == toFind) {                return true;            }        }        return false;    }

2.1.6查找某个元素对应的位置
遍历数组,观察数组中是否包含传入的参数(toFind),如果有返回下标 i,否则返回法 -1。

    // 查找某个元素对应的位置    public int indexOf(int toFind) {        for(int i = 0;i < elem.length;i++) {            if(this.elem[i] == toFind) {                return i;            }        }        return -1;    }

2.1.7获取 pos 位置的元素
查找pos下标,并返回下标pos的值。
注意事项:

检查顺序表是否为空。判断pos下标是否合法。
    //判断顺序表是否为空    private void checkEmpty() {        if(isEmpty()) {            throw new EmptyException("顺序表为空!!!");        }    }    // 获取 pos 位置的元素    public int get(int pos) {        try {            checkEmpty();            getPosIsLegitimate(pos);            return elem[pos];        }catch (PosIllegal e) {            e.printStackTrace();        }catch (EmptyException e) {            e.printStackTrace();        }        return -1;    }

2.1.8给 pos 位置的元素设为 value
将pos下标的元素更改为value。
注意事项:

检查顺序表是否为空。判断下标是否合法。
    // 给 pos 位置的元素设为 value    public void set(int pos, int value) {        try {            checkEmpty();            getPosIsLegitimate(pos);            elem[pos] = value;        }catch (PosIllegal e) {            e.printStackTrace();        }catch (EmptyException e) {            e.printStackTrace();        }    }

2.1.9删除第一次出现的关键字key
将第一次出现的关键字key删除。
注意事项:

检查顺序表是否为空。判断下标是否合法。元素减一(usedSize–)。
    //删除第一次出现的关键字key    public void remove(int toRemove) {        try {            checkEmpty();            int pos = indexOf(toRemove);            if(pos == -1) {                return;            }            else {                for(int i = pos;i < elem.length-1;i++) {                    elem[i] = elem[i+1];                }                usedSize--;            }        }catch (EmptyException e) {            e.printStackTrace();        }    }

2.1.10 获取顺序表长度
获取顺序表长度就是获取顺序表元素的个数,即usedSize。

    // 获取顺序表长度    public int size() {        return usedSize;    }

2.1.11清空顺序表
将所用元素置为零,并将usedSize置为零。
注意事项:

顺序表源码是存储泛型的,源码清空顺序表,是将所用元素置为空,而这里我们以整形为例,所以置为零。
    // 清空顺序表    public void clear() {        for(int i = 0;i < elem.length;i++) {            elem[i] = 0;        }        this.usedSize = 0;    }

3. ArrayList

在JAVA 中的ArrayList类表示顺序表。
在这里插入图片描述
说明:

ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问ArrayList实现了Cloneable接口,表明ArrayList是可以clone的ArrayList实现了Serializable接口,表明ArrayList是支持序列化的ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

3.1ArrayList的构造方法

ArrayList的三种构造方法如下:
在这里插入图片描述

3.2ArrayList的常用方法

ArrayList的常用方法如下:
在这里插入图片描述

4.ArrayList的优缺点

4.1优点

给定下标,查询速度很快。

4.2缺点

插入,删除速度慢。扩容,会造成空间浪费。

点击全文阅读


本文链接:http://zhangshiyu.com/post/183196.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1