OVERVIEW
数据间的逻辑关系
什么是数据结构?
数据结构(Data Structure)是数据的表示法,用于存储和组织数据。编写程序就像盖房子一样,要先规划出房子的结构图。
数据结构 + 算法 = 有效率的可执行程序
数据结构分类
LINEAR
线性数据结构
数据项按顺序或线性排序,每个成员都附加到其前一个和下一个相邻元素。
- 数组 (Array)
- 堆栈 (Stack)
- 队列 (Queue)
- 链表 (Linked List)
NON-LINEAR
非线性数据结构
数据项不是按顺序排列的,每个成员可以通过多条路径连接到其他成员。
- 树 (Tree)
- 图 (Graph)
开始探索
点击左侧菜单,开始探索各种数据结构的可视化操作!
LINEAR
数组 (Array)
数组是存储在连续内存位置的相同数据类型集合,支持通过索引直接访问任意元素。
生活中的例子:教室座位排号、超市货架编号、停车场车位
执行流程图
操作说明
- 插入:输入元素值和索引位置,在指定位置插入新元素
- 删除:输入索引位置,删除该位置的元素
- 查找:只输入值则遍历查找;同时输入值和索引则直接访问该位置比对
时间复杂度
- 访问(按索引):O(1)
- 查找(按值):O(n)
- 插入/删除:O(n)
应用场景
- 存储固定大小的数据集合
- 实现其他数据结构(如栈、队列)的底层
- 矩阵运算、图像处理
LINEAR
堆栈 (Stack)
堆栈是一组相同数据类型的线性组合,所有的操作均在堆栈顶端进行,具有"后进先出"(LIFO)的特性。
生活中的例子:糖果分配器、手枪弹夹、只有一个出入口的直梯
栈顶 TOP
栈底
执行流程图
操作说明
- Push:输入元素值,将其压入栈顶
- Pop:弹出并返回栈顶元素
- Peek:查看栈顶元素但不弹出
- 设置容量:输入1-20的数字设置栈的最大容量
时间复杂度
- 所有操作:O(1)
应用场景
- 反转单词
- 计算后缀表达式
- 浏览器后退按钮
LINEAR
队列 (Queue)
队列遵循"先进先出" (FIFO)规则。类似于电影售票队列,第一个进入队列的人就是第一个拿到票的人。
生活中的例子:扶梯、在食堂打饭时
→
FRONT (队首)
REAR (队尾)
←
执行流程图
操作说明
- Enqueue:输入元素值,将其添加到队尾
- Dequeue:移除并返回队首元素
- Peek:查看队首元素但不移除
- 设置容量:输入1-20的数字设置队列的最大容量
时间复杂度
- 所有操作:O(1)
应用场景
- CPU调度
- 网络设备队列
- IO缓冲
LINEAR
链表 (Linked List)
链表是包含一系列连接节点的线性数据结构。其各个数据项在计算机内存中的位置是不连续且随机存放的,优点是数据的插入或删除都相当方便。
生活中的例子:火车,有多少人就挂多少节车厢
执行流程图
操作说明
- 头部插入:输入元素值,在链表头部添加新节点
- 尾部插入:输入元素值,在链表尾部添加新节点
- 指定位置插入:输入元素值和位置,在指定位置添加新节点
- 删除指定值:输入元素值,删除第一个匹配的节点
- 查找:输入元素值,从头遍历查找该元素的位置
时间复杂度
- 头部插入/删除:O(1)
- 尾部插入/查找/删除:O(n)
NON-LINEAR
二叉树 (Binary Tree)
二叉树是一种树状数据结构,其中每个节点最多可以有两个子节点。二叉搜索树中,左子树的值都小于根节点,右子树的值都大于根节点。
生活中的例子:公司组织架构、文件目录结构、族谱
执行流程图
操作说明
- 插入节点:输入数值,按二叉搜索树规则插入新节点
- 搜索节点:输入数值,在树中查找该节点并显示路径
遍历方式
- 前序遍历:根节点 → 左子树 → 右子树
- 中序遍历:左子树 → 根节点 → 右子树(输出有序序列)
- 后序遍历:左子树 → 右子树 → 根节点
时间复杂度
- 搜索/插入/删除:O(h),h为树高
- 遍历:O(n)
NON-LINEAR
图 (Graph)
图是由顶点(Vertices)和边(Edges)组成的非线性数据结构。图将信息中的实体以及实体之间的关系,分别抽象表达成为顶点以及顶点间的边。
生活中的例子:交通路网、计算机网络、社交网络
执行流程图
操作说明
- 添加顶点:输入顶点名称(如A、B),添加到图中
- 添加边:输入起点和终点,建立两个顶点之间的连接
- BFS/DFS:从第一个顶点开始遍历所有可达顶点
图的表示
- 邻接矩阵:用二维数组表示顶点之间的关联关系
- 邻接表:将图表示为链表数组,存储效率高
遍历方式
- BFS:广度优先,按层次遍历
- DFS:深度优先,沿一条路径深入到底