跳到主要内容

解析与大整数

本节目标

用栈保存嵌套解析的外层状态,并用逐位运算完成不依赖内置大整数的十进制计算。

字符串里出现嵌套结构时,关键是进入内层前保存外层状态;十进制数超过内置整数范围时,关键是从低位到高位传播进位。这是两类不同模板:前者恢复上下文,后者维护逐位算术,不能混为一谈。

识别信号

  • 输入含有 数字[内容] 这类可嵌套的编码结构;
  • 每次遇到右括号,都要把一个已经完成的内层结果接回外层;
  • 数字以字符串给出,不能直接转成内置整数;
  • 加法或乘法必须逐位处理,并保留来自低位的进位。

问题模型与核心不变量

解析模板中,栈的每一层保存“进入当前方括号前的重复次数和已构造外层字符串”。处理 ] 时,当前字符串已经是完整内层结果;弹出栈顶并重复它,就能恢复外层构造。

大整数模板中,尚未写入结果的部分只保留在输入指针左侧。加法每次消费两个最低有效位和进位;乘法把每对数字的乘积累加到长度为 m + n 的数组中。二者都从低位到高位传播进位。

通用模板

解析:
遇到数字:累计多位重复次数
遇到 [:压入(外层字符串,重复次数),清空当前字符串
遇到 ]:弹出外层状态,将当前字符串重复后拼回外层

加法:
while 两个下标未结束 或 carry 非零:
取两个末位与 carry 的和
写入个位,更新 carry

模板变体

  • 解析可以用两个并行栈,也可以把重复次数和外层字符串组成一个状态栈;都要求在左括号处保存外层状态、在右括号处恢复内层结果。
  • 字符串加法只需一个进位;字符串乘法为每一对数字累加贡献,最后统一跳过前导零。
  • 本节不扩展到表达式计算器:计算器还需要处理运算符优先级和数值栈,不属于这里的两种模板。

母题序列

必学顺序完成下列三题:

  1. 字符串解码必学):用栈保存外层状态并恢复内层结果。
  2. 字符串相加必学):从最低位开始传播进位。
  3. 字符串相乘必学):把逐位乘积累加到 m + n 个位置。

常见误区

  • 只读取一位重复次数,遗漏 10[a] 这类多位数字。
  • 遇到右括号时没有先取出完整内层结果,导致嵌套拼接顺序错误。
  • 加法循环只检查两个下标,遗漏最高位产生的最终进位。
  • 乘法不跳过前导零,或把任一输入为 0 的结果写成空串。

迁移方向

遇到其他成对分隔符或嵌套序列时,继续使用“保存外层状态/恢复内层结果”;遇到减法、比较或更长的十进制运算时,继续使用“低位到高位传播进位”。涉及运算符优先级的表达式求值,则应单独学习双栈或递归下降解析。