1、数据结构有什么作用?
Java中提供了很丰富的容器技术,这些容器技术在底层都是通过各种各样的数据结构来实现的,只不过你在使用容器技术的时候不知不觉的就使用了。
现实生活中的存储,我们使用的工具和建模。每种数据结构都有自己的优点和缺点,想想如果百度的数据是用数组来存储的,我们还能方便的查询到所需要的数据吗?而算法,在这么多的数据中如何做到最快的插入,查找,删除,也是在追求更快。
Java是面向对象的编程语言,就好似自动挡的车,C语言好似手动挡的车。数据结构呢?是变速箱的工作原理,你完全可以不知道变速箱怎么工作,就把自动挡的车从A点开到B点,而且未必就比懂得的人慢。写程序和开车一样,经验可以起到很大作用,但是如果你不知道怎么工作的,就永远只能开车,即不会修车,也不能造车。当然了,数据结构内容比较多,学起来也很费劲,需要一个过程。我们常见的数据结构:堆栈、队列、数组、链表和红黑树等,作为数据结构的入门。
2、常见的数据结构
数据存储的常用结构有:栈、队列、数组、链表、红黑树,我们分别来了解一下。
栈
●栈:stack又称堆栈,它是运算受限的线性表,其限制是仅允许在栈的一端进行插入和删除操作,不允许在其它任何位置进行添加,查找,删除等操作。
●简单的来说,采用该结构的集合,对元素的存储有如下特点:
-
先进后出(即:存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。例如:子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,例如:子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。
-
压栈:就是存元素,即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置
-
弹栈:就是取元素,即,把栈的顶端位置元素取出,栈中已有元素向栈顶方向移动一个位置
队列
●队列:queue简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在队列的一端进行插入,而在队列的另一端进行删除
●简单来说,采用该结构的集合,对元素的存取有如下特点:
先进先出(即,存进去的元素,要在后它前面的元素依次取出后,才能取出该元素)。例如:火车过山洞,车头先进,车尾后进;车头先出,车尾后出
●队列的入口、出口各占一侧。
数组
●数组Array:是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素,就行是一排房子,有100个房间,从1-100每个房间有固定编号,通过编号就可以快速找到房子。
●简单的来说,采用该结构的集合,对元素的存取有如下特点:
- 查找元素快:通过索引,可以快速访问指定位置上的元素
- 增删元素慢:指定索引位置增加元素,需要创建一个新的数组,将指定的新元素存储在指定的位置,再把原数组中的元素根据索引,复制到新数组对应的位置上。
链表
链表:linked list 由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两部分:一个存储数据的数据域,另一个是存储下一个结点地址的指针域,我们常说的链表结构有单向链表和双向链表,那么这里我们研究单向链表。
简单的说,采用该结构的集合,对元素的存取特点如下:
- 多个结点之间,通过地址进行连接。例如:多个人手拉手,每个人使用自己的右手拉住下个人的左手,以此类推,这样多个人就连在一起了。
- 查找元素慢,想查找某个元素,需要通过连接的结点,依次向后查找指定元素
- 增删元素快
3.1增加元素:只需要修改连接下个元素的地址即可
3.2删除元素快:只需要修改连接下个元素的地址即可。
红黑树
●二叉树:binary tree是每个结点不超过2的有序树
●简单的理解,就是一种类似我们生活中的树结构,只不过每个结点上都最多只能有两个子节点。
●二叉树是每个结点最多有两个子节点的树结构,顶上的叫根结点,两边的称作左子树和右子树
我们说的二叉树的一种比较有意思的叫做红黑树,红黑树本身就是二叉树,也意味着,存放的数据必须是可排序的。