数据结构有什么作用?
当我们使用着Java官方给你提供的容器的时候,我们用起来还是非常好的,ArrayList其实就是一个无限扩充的数组,LinkedList其实就是一个无限扩充的数组,LinkedList其实就是一个链表。
现实世界中存储数据,我们要通过一些工具或者建模来进行存储。每种数据结构都有自己的优缺点。
而算法,在这么多的数据中如何以最快的速度实现插入、删除、查找数据问题。
我们Java语言是一种面向对象的编程语言,Java就相当于自动挡汽车,C语言就相当于手动挡汽车。数据结构呢?
数据结构就相当于变速箱的工作原理,不懂数据结构原理的,对于开发Java程序也是没有任何问题,
如果你懂变速箱的原理,那么不但可以开车,也可以修车,还可以造车。
数据结构内容非常多,我们介绍Java当中常见的数据结构:堆栈、队列、数组、链表和红黑树一一给大家介绍下。
常见的数据结构:
数据存储的常用结构:栈、队列、数组、链表和红黑树
栈
-
栈:又称堆栈,它是运算受限的线性表结构,它的限制是仅允许在标的的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。
简单的说,采用该结构的集合,对元素的存取有一下特点:
- 先进后出(存进去的元素,要在他后面的元素依次取出后,才能取出该元素)。例如:子弹压进弹夹和子弹从弹夹弹出的动作。
- 栈的入口、出口都是栈的顶端位置。
压栈:就是存储元素,把元素存储到栈的顶端位置,栈中已有的元素依次向栈底方向移动一个位置。
弹栈:就是取出元素,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。
队列
-
队列:queue,简称对,它同堆栈几乎一样的,也是一种运算受限的线性表结构,它的限制是仅允许在标的的一端进行插入,在标的的另一端进行删除。
简单的说,采用该结构的集合,对元素的存取有以下特点:
-
先进先出( 存进去的元素,要在它前面的元素依次取出后,才能取出该元素)。例如:火车过山洞,火车头先进山洞,火车头先从山洞出来,车尾后进来,最后出来
-
队列的入口、出口各占一侧。
数组
- 数组:Array,是有序的元素序列,数组是在内存当中开辟一段连续的空间,并在此空间内存储元素。例如:
生活中的酒店,酒店当中的房间号是连续的,不间断,有50个房间,从001---050每个房间都有固定编号,通过编号就可以快速找到酒店房间的住户。
简单的说,采用此结构的集合,对元素存取有以下特点:
-
查找元素快:通过索引,可以快速的访问到指定位置的元素。
-
增删元素慢:
-
指定索引位置增加元素:需要创建一个新数组,将指定的新元素存储到指定的索引位置,再把源数组元素根据他原来的索引,复制到新数组对应的索引位置。
-
指定索引位置删除元素:需要创建一个新数组,把源数组当中的元素根据索引,复制到新数组对应索引的位置,源数组中指定的索引位置元素不复制到新数组当中。
-
原理图如下:
链表结构
-
链表:linked list,由一系列结点node(链表当中的每个元素称为结点)组成,结点可以在运行时动态生成。每个结点包含两个部分:一个是用于存储数据元素的数据域,另一个是用来存储下一个结点地址的指针域。我们常说的链表结构有单向链表和双向链表
简单的说,采用此结构的集合,对元素的存取有以下特点:
-
多个结点之间,通过地址进行连接。比如:多个人玩丢手绢,每个人右手拉住下一个人的左手,上一个人的左手拉住该人的右手。依次类推,多个人就被连接起来。
-
查找元素比较慢:想要查找某个元素,需要通过连接的结点,依次向后查询指定的元素。
-
删除元素比较快:
- 增加一个元素:只需要修改连接下个元素的地址即可。
- 删除一个元素:只需要修改连接下一个元素的地址即可。
红黑树
- 二叉树:binary tree,每个节点数不超过2的树(tree)
简单的理解,就是类似于我们生活中的树的结构,只不过每个节点上都最多只能有两个子节点。
顶上的节点称为根节点,两边的被称为“左子树”和“右子树”
在二叉树中有一种比较特殊树结构叫做红黑树,红黑树本身就是一个二叉树
红黑树的约束:
- 节点可以是红色的也可以是黑色的
- 根节点是黑色的
- 叶子节点(空节点)是黑色的
- 每个红色节点的子节点都是黑色的
- 任何一个节点到其每一个叶子节点的所有路径上的黑色节点数是相同的。
###红黑数的特点:
查询速度非常快,趋*于*衡树,查找叶子元素最小和最大不能超过2倍。