第 3 章 栈和队列

栈 顺序栈(顺序存储结构) 存储结构:用一段连续存储单元(数组)存放栈元素 关键指针: 常见做法:top 指向当前栈顶元素位置,或指向栈顶元素的下一位置(两种约定均可,需配套一致) 上溢/下溢: 上溢(overflow):栈满仍入栈(越界) 下溢(underflow):栈空仍出栈(非法) 时间复杂度:入栈/出栈/取栈顶均为 O(1) 空间特性:需要预先分配容量 MaxSize,可能产生空间浪费或容量不足 共享栈 两个栈共享同一数组空间,分别从两端向中间增长 优点:在总空间固定时,能更充分利用存储空间;当一个栈空而另一个栈满的情况减少 满栈判定:两栈顶指针相遇(或满足相邻条件,依约定而定) 链栈(链式存储结构) 存储结构:用单链表实现,通常把表头作为栈顶以便 Push/Pop 在表头进行 栈顶指针:指向栈顶结点 优点: 不需要预先分配固定容量,理论上只受限于可用内存 入栈/出栈无需移动大量元素。 时间复杂度:入栈/出栈/取栈顶均为 O(1);额外指针域带来一定存储开销 栈的典型应用与要点 括号匹配 思想:扫描表达式,遇到左括号入栈,遇到右括号则与栈顶左括号进行匹配并出栈 关键结论: 扫描结束时栈必须为空才匹配成功; 扫描中任何时刻出现“需要出栈但栈空”则匹配失败 表达式求值与表达式转换 三种常见表示: 中缀(运算符在中间,日常书写) 后缀/逆波兰式(RPN)(运算符在后,便于用栈求值) 前缀(运算符在前) 中缀 → 后缀(人为转换逻辑,核心是“运算符栈”处理优先级与括号): 约定:运算符有优先级(如 * / 高于 + -),且多数二元运算符是左结合(同优先级从左到右计算)。括号用于改变优先级 准备: 一个输出序列(写下后缀表达式) 一个运算符栈(暂存运算符与左括号) 从左到右扫描中缀表达式的每个记号(操作数/运算符/括号): 遇到操作数:直接追加到输出序列 遇到左括号 (:入运算符栈(它的作用是“隔断”,直到遇到对应右括号才弹出) 遇到右括号 ): 反复弹出栈顶运算符并追加到输出序列,直到弹出左括号 ( 为止(左括号本身不输出) 遇到运算符 op(如 + - * /): 当运算符栈非空,且栈顶是运算符 topOp,并且: topOp 的优先级 高于 op,或 topOp 的优先级 等于 op 且 op 是左结合 则将 topOp 出栈并追加到输出序列;重复上述比较,直到不满足条件或遇到左括号 最后将当前运算符 op 入栈 扫描结束: 将运算符栈中剩余的运算符依次弹出并追加到输出序列(此时不应再有括号;若有通常说明表达式括号不匹配) 后缀表达式求值: 扫描:操作数入栈;遇运算符则弹出两个操作数计算后再入栈; 结束时栈顶即结果 出栈序列计数(卡特兰数) 问题表述(常见考点):对 n 个元素按固定顺序 1,2,...,n 依次入栈(入栈顺序固定),在允许任意时刻出栈的前提下,一共有多少种不同的出栈序列? 结论:合法出栈序列的种类数为第 n 个卡特兰数 Cn = (1 / (n + 1)) · C(2n, n) ...

April 13, 2026 · 2 min · 278 words · Guangyang Zhong

第 2 章 线性表

线性表的定义 在稍微复杂的线性表中, 一个数据元素可以有若干个数据项组成, 常把数据元素称为记录, 含有大量记录的线性表又称为文件 表中元素的个数有限 表中元素具有逻辑上的顺序性, 均为数据元素, 数据类型都相同, 具有抽象性 注意: 线性表是一种逻辑结构 线性表的表示 顺序表 定义 逻辑顺序与其物理存储顺序完全一致 主要优点 可进行随机访问 存储密度高 主要缺点 插入和删除操作效率较低, 需要移动大量元素 要求分配连续的存储空间 基本操作的实现 顺序表的初始化 静态分配 动态分配 插入操作 时间复杂度 最好情况: 在尾标插入, O(1) 最坏情况: 在表头插入, O(n) 平均情况: O(n) 删除操作 时间复杂度 最好情况: 删除表尾元素, O(1) 最坏情况: 删除表头元素, O(n) 平均情况: O(n) 查找操作 时间复杂度 按值查找, O(n) 按索引查找, O(1) 常见算法 双指针 王道 P20 05. 倒置 王道 P20 07. 10. Boyer–Moore 投票算法 王道 P20 12. 空间换时间 王道 p21 13. ...

March 14, 2026 · 1 min · 115 words · Guangyang Zhong

第 1 章 绪论

基本概念和术语 数据: 是对客观事物的符号表示, 在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称 数据元素: 是数据的基本单位, 在计算机程序中通常作为一个整体进行考虑和处理(一个数据元素可由若干个数据项组成) 数据对象: 是性质相同的数据元素的集合, 是数据的一个子集 数据结构: 是相互之间存在的一种或多种特定关系的数据元素的集合. 包括三方面的内容: 逻辑结构, 存储结构和数据的运算 线性结构 非线性结构: 集合, 树形结构, 图状结构或网状结构 存储结构(物理结构): 数据结构在计算机中的表示(又称映像) 数据元素在计算机中的映像称为元素或结点, 例如通常用一个字长的位串表示一个整数, 通常称这个位串为元素或节点. 当数据元素由若干数据项组成时,位串中对应于各个数据项的子位串称为数据域 * 顺序存储结构(顺序映像) * 链式存储结构(非顺序映像) * 索引存储 * 散列存储(哈希存储) 算法的设计取决于选定的数据逻辑结构, 而算法的实现依赖于采用的存储结构 数据类型: 和数据结构密切相关的一个概念, 最早出现在高级程序语言中, 用以刻画(程序)操作对象的特性 原子类型 结构类型 抽象数据类型(ADT): 是指一个数学模型以及定义在该模型上的一组操作 原子类型 固定聚合类型 可变聚合类型 后两种可统称为结构类型 多形数据类型: 指其值的成分不确定的数据类型 算法和算法分析 5 个重要特性: 有穷性 确定性 可行性 输入 输出 算法的设计要求 正确性 可读性 健壮性 效率与低存储量需求 算法效率的度量 事后统计的方法 事前分析估算的方法 算法的存储空间需求 如果一个问题所占的输入数据空间是固定的、和算法无关的, 那我们在分析空间复杂度时,只需要关注算法额外使用的空间(也叫辅助空间)

February 28, 2026 · 1 min · 69 words · Guangyang Zhong