你打开一个 App,刷一刷、存点东西、搜个好友——背后都是数据结构在干活。

别被名字吓到,数据结构其实就是“怎么把东西摆好,方便以后找、方便以后改”。这篇文章用大白话(外加几张漫画)把最常见的 8 种一次讲清楚。

一、数组(Array)= 一排带编号的储物柜

数组最简单:在内存里给你一排连在一起的格子,从 0 开始编号。

  • 想知道第 3 个是什么?直接按编号 2 去拿,一步到位(时间复杂度 O(1))。
  • 缺点是:这排格子长度固定,中间想插一个,后面所有人都得往后挪,费劲。

数组就像一排带编号的储物柜

一句话:下标访问快,插入删除慢。

二、链表(Linked List)= 寻宝线索,每关指向下一关

链表不追求“排排坐”,而是每个节点都记着“下一个是谁在哪”。

  • 想从头找到尾,就顺着线索一个个走下去。
  • 想在中间插入?只要改一下前后两条线索,不用搬动其他人,插入删除快。
  • 代价是:不能跳着找,想知道第 5 个,得从第一个一路数过去,随机访问慢。

链表就像寻宝线索

一句话:插入删除快,但找不到第几个直接拿。

三、栈(Stack)= 一摞盘子,后进先出

想象你洗碗,洗好的盘子往上叠。最后放上去的,最先被拿走——这就是“后进先出” LIFO。

  • 只能从顶部放(push)和取(pop)。
  • 典型场景:撤销操作(Ctrl+Z)、函数调用、浏览器后退。

栈就像一摞盘子

一句话:只许一头进出,后进的先出。

四、队列(Queue)= 排队买票,先进先出

排队大家都熟:先来的人先办完走人——这就是“先进先出” FIFO。

  • 新来的站到队尾(enqueue),办完的从队首离开(dequeue)。
  • 典型场景:打印机排队、消息队列、秒杀排队。

队列就像排队买票

一句话:一头进一头出,先来的先走。

五、哈希表(Hash Table)= 按名字直接找衣柜

你去健身房,柜子太多记不住位置?那就给每个柜子编个号,按名字算编号。

“小明”这个名字经过一个叫哈希函数的小机器,立刻算出该去第 7 号柜——一步到位,不用挨个找。

  • 理想情况下存取都是 O(1),超级快。
  • 万一两个名字算到同一个柜子(哈希冲突),就用“链地址法”在同一个柜子挂一串。

哈希表就像按名找柜

一句话:用名字算位置,查找飞快。

六、树(Tree)= 家谱 / 公司组织架构

树就是一个根,往下分叉:老祖宗在顶上,孩子是分支,最底下的叫叶子。

  • 二叉树最多两个孩子,常用于高效查找(二叉搜索树:左小右大)。
  • 文件系统、公司层级、DOM 结构,全是树。

树就像家谱

一句话:一层管一层,查找能砍掉一半。

七、堆(Heap)= 小顶金字塔

堆是一棵特殊的树,规矩是:父节点永远比孩子“小”(小顶堆)或“大”(大顶堆)。

  • 所以最小的那个一定在塔尖,取最小值只要 O(1)。
  • 典型场景:优先队列、Top-K 问题、堆排序。

堆就像金字塔

一句话:塔尖永远是最大或最小,取最值飞快。

八、图(Graph)= 朋友圈 / 地铁线

前面的结构大多“一条道”,图就不一样了:任意两点都能连,还能成环。

  • 节点是人,边是“认识/连通”。
  • 地铁线路图、社交网络、地图导航,全是图。
  • 经典问题:最短路径(导航怎么走最快)、连通性。

图就像朋友圈

一句话:谁和谁都可能是朋友,关系最自由。

九、一张表总结

结构 大白话 典型用途
数组 一排编号储物柜,下标直取 频繁按位置读写
链表 寻宝线索,逐环相扣 频繁插入删除
栈 一摞盘子,后进先出 撤销、函数调用
队列 排队买票,先进先出 排队、消息缓冲
哈希表 按名算号找柜子 快速查找、缓存
树 家谱一层管一层 层级数据、搜索
堆 塔尖最值 优先队列、Top-K
图 朋友圈随意连 社交、导航、网络

看完这 8 张图,你会发现:数据结构没有谁好谁坏,只有谁更适合当下的活儿。把“东西怎么摆”想清楚,代码自然就顺了。