数据结构中双栈的实现方法分享
不卖关子,直接进入主题:
首先最重要的,我们需要两个和栈 数值栈 和 运算符栈 。
在遍历时,需要同时对后缀表达式的 生成方式 和 计算方式 这两方面同步进行。
核心就是在每次运算符栈的弹栈操作均伴随着一次数值的计算,共三处
- 遍历到运算符
- 遍历到右括号
- 遍历完处理非空的运算符栈
根据运算符的种类,对数值栈的栈顶元素和栈顶倒数第二个元素进行运算,并将计算结果再次保存到数值栈中。
- 预处理和辅助细节
- 过滤原表达式无用的空格。
- 对于单元运算符 +/- 在左括号后的出现,可以添加占位 0 构成 0 + num 或 0 - num 的操作。
- 对于一些特殊表达式如 -1 可以在数字栈放一个占位的 0,保证每次的操作在数字栈中能有至少两个操作数。
- 可以用一个哈希表维护各类运算符的优先级问题。
下面代码以:针对如 772. 基本计算器 III 包含加减乘除小括号的综合应用展示。
由于 772 是会员题,读者可以分别练习 224. 基本计算器 和 227. 基本计算器 II 作为代替。
其中 224 为处理加减小括号,227 为处理加减乘除。
小结
表达式求值是数据结构的学习中非常经典的一个应用。将中缀表达式化为后缀表达式的核心就是两点
- 后缀表达式的单次计算方式;
- 后缀表达式的生成方式。
在考研中一般要求学生能够写出单次计算和后缀表达式生成的全过程。而求职中则需要能够 ac 掉笔试的代码题。因此每位读者都应该熟练掌握应对知识点和方法。
最后基于双栈的方法除了处理本文中提到的常见四则运算外,还可以针对四则运算以外的运算符或者自定义的运算符进行处理。对于这点读者可以作为拓展自行尝试。