参考:https://blog.csdn.net/yeyazhishang/article/details/82353846
总结
线性结构:栈(先进后出)、队列(先进先出);
数组结构:遍历查询快,如散列表(key/value访问,如拉链法)
链表结构:增删操作快;
树结构:大量动态数据操作,如二叉树(数组与链表结合)、堆(完全二叉树的数组对象);
*数组:存储结构连续
优点:有索引,查询、遍历快;
缺点:不能扩容,只能存储一种类型数据;添加或者删除操作慢;
使用场景:频繁查询,存储空间要求不大,很少增、删操作;
*栈:
特点:先进后出,后进先出;一种线性表,且只能从一端(栈底)操作;
*队列
特点:先进先出;一种线性表,一端放入元素,另一端取出元素
使用场景:多线程阻塞队列中非常适用;
*链表:
存储结构不连续,逻辑顺序是通过指针地址实现;每个元素包含两个结点,一个数据域(内存空间),一个指针域(指向下一个结点地址)
优点:不需要初始化容量,增删快;
缺点:占用空间大;查找元素非常耗时;
适用场景:数据量小,增删操作频繁;
*树:
每一个非根结点有且只有一个父结点;
每个子节点可以分为多个不相交的子树;
二叉树用得最多,还有很多二叉树的扩展如平衡而参数、红黑树、B+树等;
二叉树
左子树和右子树是有序的,次序不能颠倒;即使某个结点只有一个子树,也要区分左右子树。
优点:数组和链表的优点;
适用场景:大量动态数据;
*散列表,即哈希表
根据key、value直接访问数据结构;通过key得到数组下标;
基于数组衍生的数据结构,如数组加链表结构的拉链法;
应用场景多,问题也多,如哈希冲突,如果处理不好,耗时且导致应用崩溃;
*堆
可以看做一个树的数组对象;
堆中某个结点的值总是不大于(大堆顶)或者小于(小堆顶)父节点的值;
堆始终是一棵二叉树;
*图
图是由结点的有穷集合V和边的集合E组成;
有点类似树结构,分有向图和无向图,结点称为顶点为与树区分;