--- title: 线性结构 tags: - module - data-structure-and-algorithm - linear-structure - joplin type: module source_type: reconstructed created: 2026-04-22 updated: 2026-04-22 --- # 线性结构 > [!abstract] > 这一模块处理最基础也最常考的一类结构。核心不是把表、栈、队列分开死记,而是理解“线性关系”和“操作受限”如何改变实现方式与复杂度。 ## 模块结论 - [[顺序表]] 和 [[链表]] 解决的是同类线性关系,但一个偏随机访问,一个偏灵活插删。 - [[栈]] 和 [[队列]] 不是新结构,而是在一般线性表上增加操作限制。 - 串本质上也是特殊线性表,其重点在模式匹配,典型代表是 [[KMP]]。 ## 一、线性表的两种基本实现 ### 顺序表 - 用连续存储空间组织元素。 - 优点是随机访问快,按位查找方便。 - 缺点是中间插入删除通常需要大量移动元素。 ### 链表 - 结点在逻辑上线性相连,物理上可不连续。 - 优点是插入删除灵活。 - 缺点是不能像数组一样直接按下标 O(1) 访问。 ### 如何比较两者 - 查找某个位置的元素:顺序表更直接。 - 已知位置附近做插删:链表更灵活。 - 内存是否连续、是否需要扩容,也会影响选择。 ## 二、单链表与双链表 - 单链表每个结点只记录后继。 - 双链表同时记录前驱和后继,删除与逆向访问更方便。 - 带头结点和不带头结点是另一条重要区分线。 ### 复习重点 - 头结点常用于统一空表和首元结点操作。 - 删除链表结点时要分清是“已知前驱”还是“仅知当前结点”。 ## 三、栈 - 后进先出,LIFO。 - 典型操作是入栈、出栈、取栈顶。 - 顺序栈和链栈分别对应顺序存储和链式存储。 ### 高频应用 - 括号匹配 - 中缀表达式转后缀表达式 - 函数调用与递归过程 ## 四、队列 - 先进先出,FIFO。 - 典型操作是入队、出队、取队头。 - 顺序队列的重点是循环队列与判空判满设计。 - 链队列的重点是 `front`、`rear` 指针维护。 ### 循环队列常见判满方式 - 牺牲一个存储单元 - 额外维护 `size` - 额外维护 `tag` ## 五、串与模式匹配 - 串是元素类型固定为字符的线性表。 - 重点不在存储本身,而在子串查找。 - 朴素匹配每次失配后回溯主串,[[KMP]] 则利用模式串自身信息减少回退。 ## 六、易错点 - 不要把“顺序表查找快”误解为所有查找都快,它只是按位访问快。 - 链表插删快的前提通常是已经找到插删位置。 - 队列中 `front` 和 `rear` 的具体含义要结合实现约定看,不能脱离代码模板死记。 - KMP 的难点不是模板代码,而是 `next` / `nextVal` 表示什么。 ## 七、复习提问 - 顺序表和链表分别适合什么操作场景? - 栈和队列为什么说是“操作受限的线性表”? - 循环队列为什么会出现判空判满冲突? - KMP 相比朴素模式匹配到底省掉了什么回溯? ## 来源 - [[raw/Joplin/计算机专业基础/数据结构与算法/(C++)数据结构与算法/1.线性表 -- 顺序表.md]] - [[raw/Joplin/计算机专业基础/数据结构与算法/(C++)数据结构与算法/2.线性表 -- 单链表.md]] - [[raw/Joplin/计算机专业基础/数据结构与算法/(C++)数据结构与算法/3.线性表 -- 双链表.md]] - [[raw/Joplin/计算机专业基础/数据结构与算法/(C++)数据结构与算法/4.操作受限的线性表 -- 栈 -- 顺序栈.md]] - [[raw/Joplin/计算机专业基础/数据结构与算法/(C++)数据结构与算法/5.操作受限的线性表 -- 栈 -- 链栈.md]] - [[raw/Joplin/计算机专业基础/数据结构与算法/(C++)数据结构与算法/6.操作受限的线性表 -- 队列 -- 顺序队列.md]] - [[raw/Joplin/计算机专业基础/数据结构与算法/(C++)数据结构与算法/7.操作受限的线性表 -- 队列 -- 链队列.md]] - [[raw/Joplin/计算机专业基础/数据结构与算法/(C++)数据结构与算法/8.栈和队列的应用.md]] - [[raw/Joplin/计算机专业基础/数据结构与算法/(C++)数据结构与算法/9.串.md]] ## 相关页面 - [[数据结构与算法]] - [[顺序表]] - [[链表]] - [[栈]] - [[队列]] - [[KMP]]