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

数据结构(JAVA)顺序表

17 人参与  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)
  • 赞助本站

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

最新文章

  • 祖母寿宴,侯府冒牌嫡女被打脸了(沈屿安秦秀婉)阅读 -
  • 《雕花锦年,昭都旧梦》(裴辞鹤昭都)完结版小说全文免费阅读_最新热门小说《雕花锦年,昭都旧梦》(裴辞鹤昭都) -
  • 郊区41号(许洛竹王云云)完整版免费阅读_最新全本小说郊区41号(许洛竹王云云) -
  • 负我情深几许(白诗茵陆司宴)完结版小说阅读_最热门小说排行榜负我情深几许白诗茵陆司宴 -
  • 九胞胎孕妇赖上我萱萱蓉蓉免费阅读全文_免费小说在线看九胞胎孕妇赖上我萱萱蓉蓉 -
  • 为保白月光,侯爷拿我抵了债(谢景安花田)小说完结版_完结版小说全文免费阅读为保白月光,侯爷拿我抵了债谢景安花田 -
  • 陆望程映川上官硕《我的阿爹是带攻略系统的替身》最新章节阅读_(我的阿爹是带攻略系统的替身)全章节免费在线阅读陆望程映川上官硕
  • 郑雅琴魏旭明免费阅读_郑雅琴魏旭明小说全文阅读笔趣阁
  • 头条热门小说《乔书意贺宴临(乔书意贺宴临)》乔书意贺宴临(全集完整小说大结局)全文阅读笔趣阁
  • 完结好看小说跨年夜,老婆初恋送儿子故意出车祸_沈月柔林瀚枫完结的小说免费阅读推荐
  • 热推《郑雅琴魏旭明》郑雅琴魏旭明~小说全文阅读~完本【已完结】笔趣阁
  • 《你的遗憾与我无关》宋怀川冯洛洛无弹窗小说免费阅读_免费小说大全《你的遗憾与我无关》宋怀川冯洛洛 -

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

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