3.3 栈在括号匹配中的应用、栈在表达式求值中的应用(上)·综合题讲评
约 40 分钟
3.3 综合题:带错误定位的表达式检查器
一个可靠检查器不能只返回真假,还要区分右括号过早、类型错配、左括号残留和表达式记号错误。扫描时栈中保存 (括号字符,位置);遇右括号先检查空栈,再比较类型。结束后若栈非空,栈顶通常是最近一个未闭合位置。
表达式求值也应分词,而非逐字符处理。123 是一个整数,不是 1、2、3 三个操作数;负号可能是一元运算符。最小实现可明确只接受非负整数、二元 + - * / 和圆括号,并在接口处拒绝其他输入。
手工推演 12*(3+4)):位置 2 的左括号入栈;读第一个 ) 成功匹配并弹出;末尾第二个 ) 遇空栈,应报告“多余右括号”及其位置,而不是笼统说表达式错误。
求值时可在转后缀阶段检查相邻 token 合法性:操作数后可接运算符或右括号,二元运算符后应接操作数或左括号。后缀求值遇运算符时栈中少于两个数,说明操作数不足;最终栈中不恰好一个值则说明结构有误。
复杂度仍为 ,因为诊断信息没有改变每个 token 最多入栈出栈一次的事实。代码必须在除法前检查除数为零。
错解反馈:捕获异常后继续用不完整栈求值会产生伪答案;把所有负号都当二元减法会拒绝 -3+5;只检查括号正确就宣布表达式合法,忽略运算符与操作数次序。
迁移练习:为输入 2+*3 给出最早错误位置与原因。答案在 * 处:二元 + 后应出现操作数或左括号,却又出现二元运算符。独立验收:为四类错误各设计一例,并验证位置准确。
小纸条
诊断:表达式2+*3的最早错误在哪里,为什么?
登录 后可看答案
Practice
本课练习
先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。
本课练习正在补齐,暂不应标记为完成。