解析与大整数
本节目标
用栈保存嵌套解析的外层状态,并用逐位运算完成不依赖内置大整数的十进制计算。
字符串里出现嵌套结构时,关键是进入内层前保存外层状态;十进制数超过内置整数范围时,关键是从低位到高位传播进位。这是两类不同模板:前者恢复上下文,后者维护逐位算术,不能混为一谈。
识别信号
- 输入含有
数字[内容]这类可嵌套的编码结构; - 每次遇到右括号,都要把一个已经完成的内层结果接回外层;
- 数字以字符串给出,不能直接转成内置整数;
- 加法或乘法必须逐位处理,并保留来自低位的进位。
问题模型与核心不变量
解析模板中,栈的每一层保存“进入当前方括号前的重复次数和已构造外层字符串”。处理 ] 时,当前字符串已经是完整内层结果;弹出栈顶并重复它,就能恢复外层构造。
大整数模板中,尚未写入结果的部分只保留在输入指针左侧。加法每次消费两个最低有效位和进位;乘法把每对数字的乘积累加到长度为 m + n 的数组中。二者都从低位到高位传播进位。
通用模板
解析:
遇到数字:累计多位重复次数
遇到 [:压入(外层字符串,重复次数),清空当前字符串
遇到 ]:弹出外层状态,将当前字符串重复后拼回外层
加法:
while 两个下标未结束 或 carry 非零:
取两个末位与 carry 的和
写入个位,更新 carry
模板变体
- 解析可以用两个并行栈,也可以把重复次数和外层字符串组成一个状态栈;都要求在左括号处保存外层状态、在右括号处恢复内层结果。
- 字符串加法只需一个进位;字符串乘法为每一对数字累加贡献,最后统一跳过前导零。
- 本节不扩展到表达式计算器:计算器还需要处理运算符优先级和数值栈,不属于这里的两种模板。
母题序列
按必学顺序完成下列三题:
常见误区
- 只读取一位重复次数,遗漏
10[a]这类多位数字。 - 遇到右括号时没有先取出完整内层结果,导致嵌套拼接顺序错误。
- 加法循环只检查两个下标,遗漏最高位产生的最终进位。
- 乘法不跳过前导零,或把任一输入为
0的结果写成空串。
迁移方向
遇到其他成对分隔符或嵌套序列时,继续使用“保存外层状态/恢复内层结果”;遇到减法、比较或更长的十进制运算时,继续使用“低位到高位传播进位”。涉及运算符优先级的表达式求值,则应单独学习双栈或递归下降解析。