参考书:数据机构与算法设计 c++语言描述(第二版)Larry Nyhoff 著 黄明达 等译 陈佩佩 审
文章是自己根据博主内容总结扩充 结合资料总结出来的
数据结构八大数据结构:队列(Queue)树(Tree)堆(Heap)数组(Array)栈(Stack)链表(Linked List)图(Graph)散列表(Hash)**
1、数组
数组可以连续储存多个元素 在内存中分配也是连续的 元素通过数组下标访问(下标从0开始)
例:int[] data = new int[50]; data[0]=1;
定义了数组第一个值为1的数组
优点:遍历数组很方便
缺点:1、无法扩容 2、数据类型单一3、添加删除数组需要移动其他元素 很慢
列表:ADT:基本操作:
1、构造函数
2、判空
3、插入
4、删除
5、遍历
2、栈(水桶)例如水桶里倒入泥土 要挖出泥土时从最上层开始挖则这时的顶部叫做栈顶 但底层却只能等
例子:扑克牌游戏 游戏者可以打出一个牌到这个堆堆顶部,或者可以提取这个已出牌堆顶上的一张牌
顶层的泥土挖完才能移动成为栈底
先进后出 后进先出
从栈顶放入元素(入栈);取出元素(出栈)
ADT:
1、构造函数
2、empty();检查一个栈并根据栈里是否包含值来返回true 或 false
3、push();在栈顶添加一个值来修改栈
4、top();提取栈顶的值
5、pop();从栈顶删除一个值来修改栈
display()显示储存在栈中的所有元素
🌟:后缀表示(RPN) 中缀表达式转换为后缀表达式 计算后缀表达式的值
3、队列
先进先出后进后出(一端添加元素(入队) 一段取出元素(出队))
例如:超市排队付款 随着人们的增加在队尾加入人则为入队 结账完毕则离开叫做出队
ADT:
1、创建一个空队列
2、检查队列是否为空
3、enqueue();在队列后段添加元素
4、front();从队列前端提取一个值
5、dequeue();从对列的前端删除一个值
4、链表
是物理存储单元上非连续非顺序的存储结构
优点:不需要初始化容量 可以任意加减元素。添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快;
缺点:占用空间很大 遍历链表非常耗时
类型:
1、带头节点的列表
2、循环链表
3、双向链表
5、树
由n个有限节点组成的
重点:二叉树
1、每个节点最多有两棵子树
2、左子树和右子树有顺序不能颠倒
3、只有一棵子树也要区分左右子树
(处理大批量的动态数据)
例子 1、某些阶段都是两种结果反复出现的实现
🌟:遍历 前序遍历 中序遍历 后序遍历
🌟:哈夫曼编码 哈夫曼树
6、散列表 哈希表(键、值) 引申到java hashmap hashtable
key:记录存储到位置
value:存在在以key为下标的数组空间中
7、堆 (一棵树的数组对象)
根节点最大的堆(最大堆)(大根堆)
跟节点最小的堆(最小堆)(小根堆)
根据堆有序的特点 一般用来做数组的排序 堆排序
8、图(由节点的有穷集合和边的集合组成)
按照顶点指向方向(无向图 有向图)
图是一种比较复杂的数据结构,在存储数据上有着比较复杂和高效的算法,分别有邻接矩阵 、邻接表、十字链表、邻接多重表、边集数组等存储结构