数据结构 数组

数据结构概述

数据结构?什么玩意儿?哎呀,你这可把我难住了,我可不是什么计算机专家,但我也尽力给你解释一下。

数据结构就像是咱们这个世界里的各种组织模式一样,是用来组织和存储数据的一种形式。你能够把它看作是一种框架,能够让你把数据整顿得东倒西歪。就好比是在这个大杂烩的世界里,给你提供了一种整顿思路,让你不至于变得乌七八糟。

那数据结构到底有啥用呢?嗯,其实它的益处可不少。首先,它可能提供一种高效的数据拜访形式,让你可能疾速地查找、插入或删除数据。就像是你要找某本书,如果书架是乌七八糟的,你得费好大劲能力找到你想要的那本书。但如果书架是依照肯定的规定摆放的,你就能迅速地找到它。

其次,数据结构也可能帮忙你节约空间。就像是在你家整顿货色一样,如果你不加以整顿,很快就会变得一团糟。但如果你正当地安顿每个货色的地位,就可能节约空间,让你的家看起来更整洁。

哎呀,这样解释起来还挺形象的。数据结构嘛,就是一种组织数据的形式,让你可能高效地操作和治理数据。就像是给你的思维提供了一套整顿规定,让你在这个纷繁复杂的数据世界中熟能生巧。

分类

首先,咱们得晓得数据结构有啥分类呢。嗯,咱们能够把它们分成两大类,一类是线性构造,一类是非线性构造。

咱先聊聊线性构造吧。就像是一条直线上的货色一样,线性构造中的数据元素是依照线性的秩序排列的。最简略的线性构造就是数组,咱们能够把它设想成一排房子,一个挨着一个。还有链表,它是一串环环相扣的珠子,每个珠子都有指向下一个珠子的指针。这些线性构造都有一个特点,就是只能从一个方向拜访数据元素。

而后,咱们再说说非线性构造。这些构造就比拟神秘了,就像是在一片茫茫大海里,有各种各样的岛屿和海洋生物。其中,最有名的非线性构造莫过于树和图了。树就像是一颗大树,有根、枝干和叶子,各个节点之间有着父子关系。而图则更加简单,能够设想成一张网络地图,各个节点之间能够有各种连贯关系。非线性构造的特点就是数据元素之间的关系不是简略的一对一,而是多对多的。

嘿嘿,这就是数据结构的分类啦。线性构造就像是一条直线上的货色,非线性构造就像是陆地里的岛屿和生物,有着各种各样的关系。记住了,数据结构就像是这个世界里的秩序,让咱们可能更好地了解和解决数据的乌七八糟。

数组

哈哈哈,你找对人了,来,我就给你道个假相,说说数据结构中的数组吧。

先说说数组的长处。数组就像是一排整齐划一的小屋,每个小屋都有本人的地址。它的最大长处就是快速访问。因为数组中的元素是间断存储的,咱们能够通过索引间接定位到须要的元素,不用费太多工夫。就像是你想找一个人,如果他住在一条参差的街道上,你只须要晓得他的门牌号就能迅速找到他。

然而,数组也有它的毛病。最大的问题就是大小固定。一旦数组被创立,它的大小就无奈扭转了。就好比是你买了一排房子,房子的数量是固定的,你不能轻易减少或缩小。如果你须要存储的元素数量超过了数组的大小,就会造成内存节约或者无奈存储所有的元素。而且,如果你想要插入或删除数组中的元素,就得搬家了。就像是你想在一排房子中插入一个新的房子,你须要把前面的房子都往后挪动,空出地位给新的房子。

哈哈,这就是数组的假相。它可能提供快速访问的劣势,然而大小固定和插入/删除的操作会让你陷入麻烦。就像是你要在一排房子中减少或缩小房子一样,得费些周折。所以,在抉择数据结构的时候,得依据具体情况来判断,看看是不是适宜用数组这种形式。

编码-搞起来

让咱们撸起袖子来实现一个相似赫赫有名的ArrayList一样的动静数组的数据结构吧!Come On

设计Api

首先咱们想想一个线性的数据结构须要具备什么样的性能?什么?那我帮咱们捋捋
获取性能
int getSize(); 获取大小E get(int index); 依据索引获取值int indexOf(E e);  依据值获取索引String toString(); 打印数组所有值
判断性能
boolean isEmpty(); 是否为空boolean contains(E e); 是否蕴含该元素
增加性能

void add(int index,E e); 增加元素到指定索引void add(E e); 增加元素void addFirst(E e); 增加到数组后面void addLast(E e); 增加到数组尾部
批改性能
void set(int index,E e); 批改指定索引地位的元素
删除性能

E remove(int index,E e); 删除指定索引上的值,并返回删除的值E removeFrist(); 删除数组后面的值E removeLast(); 删除数组尾部的值
转换性能
快爆肝了,这个你们本人搞吧,能够在评论区留言

盘它!

/** * @author sssd * @careate 2023-07-03-7:30 */public class ArrayList<E> {    /**     * 这个不多说,用数组实现     */    private E[] data;    /**     * 这个示意咱们这个ArrayList的可用长度     */    private int size;    /**     * 初始化结构     *     * @param capacity     */    public ArrayList(int capacity) {        //java语言须要注意的中央        data = (E[]) new Object[capacity];        //刚开始的时候长度为0        size = 0;    }    /**     * 初始化结构     */    public ArrayList() {        //默认初始化数量为10        this(10);    }    public int getSize() {        return size;    }    public E get(int index) {        if (index < 0 || index >= size) {            throw new IllegalArgumentException("你丫看看index的值,传了个啥...");        }        return data[index];    }    public int indexOf(@NotNull E e) {        for (int i = 0; i < size; i++) {            if (e.equals(data[size])) {                return i;            }        }        return -1;    }    public void add(int index, E e) {        if (size == data.length) {            throw new IllegalArgumentException("你丫看看都越出了,还往里面塞...");        }        if (index < 0 || index > size) {            throw new IllegalArgumentException("你丫看看index的值,传了个啥...");        }        for (int i = size - 1; i >= index; i--) {            data[i + 1] = data[i];        }        data[index] = e;        size++;    }    public void addFirst(E e) {        add(0, e);    }    public void addLast(E e) {        add(size, e);    }    public E remove(int index) {        if (index < 0 || index >= size) {            throw new IllegalArgumentException("你丫看看index的值,传了个啥...");        }        E e = data[index];        for (int i = index + 1; i < size; i++) {            data[i - 1] = data[i];        }        size--;        return e;    }    public E removeFirst() {        return remove(0);    }    public E removeLast() {        return remove(size);    }    public void set(int index, E e) {        if (index < 0 || index >= size) {            throw new IllegalArgumentException("你丫看看index的值,传了个啥...");        }        data[index] = e;    }    public boolean contains(E e) {        for (int i = 0; i < size; i++) {            if (e.equals(data[i])) {                return true;            }        }        return false;    }    @Override    public String toString() {        StringBuilder builder = new StringBuilder();        builder.append("[");        for (int i = 0; i < size; i++) {            if (i == size - 1) {                builder.append(data[i]);            } else {                builder.append(data[i] + ",");            }        }        builder.append("]");        return builder.toString();    }}

作者:傻傻三多

出处:https://www.sssd.top

版权:本作品采纳「署名-非商业性应用-雷同形式共享 4.0 国内」许可协定进行许可。

本文由博客一文多发平台 OpenWrite 公布!