最近一直在搞关于数据结构的东西,做一下总结吧,文章参照了该博文的http://www.cnblogs.com/Yellow-ice/p/5326856.html在此致谢,时间是2017.8.2上午

常见的数据结构分为以下几种:数组,链表,队列,栈,树,堆,图。还有散列表和集合类为java常用,字符串也常常被当成数据结构,如下图所示:

按照逻辑结构可以分为以下四种:

#数据结构概述
##定义
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合
##分类
(1)线性数据结构:元素之间一般存在元素之间存在一对一关系,是最常用的一类数据结构,典型的有:数组、栈、队列和链表
(2)树形结构:结点间具有层次关系,每一层的一个结点能且只能和上一层的一个结点相关,但同时可以和下一层的多个结点相关,称为“一对多”关系,常见类型有:树、堆
(3)图形结构:在图形结构中,允许多个结点之间相关,称为“多对多”关系
(4)集合结构

线性数据结构

数组和链表

非受限的线性表:可以在任意位置进行插入和删除操作。

数组和链表

a、数组:存放着一组相同类型的数据,需要预先指定数组的长度,有一维数组、二维数组、多维数组等
b、链表:它采用动态分配内存的形式实现,用一组任意的存储单元存放数据元素链表的,一般为每个元素增设指针域,用来指向后继元素。一般包括单链表、双向链表、循环链表和双向循环链表

数组和链表的区别

逻辑结构来看:数组必须事先定义固定的长度,不能适应数据动态地增减的情况,;链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项平均时间复杂度O(1)(数组中插入、删除数据项时,需要移动其它数据项平均时间复杂度O(n)) ,链表胜

访问方式来看:数组在内存中是连续存储的,因此,可以利用下标索引进行随机访问O(1);链表是链式存储结构,在访问元素的时候只能通过线性的方式由前到后顺序访问,所以访问效率比数组要低O(n) 数组胜

##栈和队列
###实现形式
二者均可采用顺序存储和链式存储的方法进行存储。
###栈和队列
a, 栈:只允许在序列末端进行操作,栈的操作只能在栈顶(也就是序列末端)进行,一般栈又被称为后进先出或先进后出的线性结构
受限的线性表:只能在栈顶进行插入和删除操作。

顺序栈:采用顺序存储结构的栈称为顺序栈,即需要用一片地址连续的空间来存储栈的元素
链栈:采用链式存储结构的栈称为链栈

b、队列:只允许在序列两端进行操作,一般队列也被称为先进先出的线性结构
受限的线性表:只能在队头(序列开端)进行删除操作,只能在队尾(序列末端)进行插入操作。

循环队列:采用顺序存储结构的队列,需要按队列可能的最大长度分配存储空间
链队列:采用链式存储结构的队列称为链队列,一般需要设置头尾指针指向链表的头尾结点

#树形数据结构
##树
树是含有n(n>=0)个结点的有限集合,在任意一棵非空树中:1,有且仅有一个特定的称为根的结点。2、当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每一个集合本身又是一棵树,并且T1,T2,…,Tm称为根的子树
###二叉树
定义:二叉树是一种递归数据结构,是含有n(n>=0)个结点的有限集合,二叉树具有以下特点:1,二叉树可以是空树;2,二叉树的每个结点都恰好有两棵子树,其中一个或两个可能为空;3,二叉树中每个结点的左、右子树的位置不能颠倒,若改变两者的位置,就成为另一棵二叉树

##堆
是具有以下特性的完全二叉树,其所有非叶子结点均不大于(或不小于)其左右孩子结点。若堆中所有非叶子结点均不大于其左右孩子结点,则称为小顶堆(小根堆),若堆中所有非叶子结点均不小于其左右孩子结点,则称为大顶堆(大根堆)
#图形数据结构
图形结构:在图形结构中,允许多个结点之间相关,称为“多对多”关系,可分为有向图和无向图
#集合数据结构
一般为java中常用的集合类,其底层皆由基本数据结构封装。