分享|用单调栈处理四则运算表达式
605
2024.02.07
2024.02.08
发布于 未知归属地

今天刷到了花括号展开的题目,我发现这个问题与四则运算表达式的计算很相似,然后又复习了一下双栈法处理四则运算表达式的算法。1.数字入数据栈。2.比符号栈顶元素高优先级更高的符号直接入符号栈。3.小于等于符号栈顶优先级的符号先把所有优先级更大的符号出栈同时数据栈出栈两个元素参与运算后将结果放入数据线,最后再将符号入栈。4.遇到左括号直接入栈,同时重新开一个子栈。5.遇到右括号,逐个弹出子栈的符号进行计算,直到弹出左括号。

我发现,符号栈的每个子栈里的符号优先级是严格单调递增的,这不就是单调栈的性质吗?符号栈整体实际上也是单调递增的,在(栈深,优先级)二元属性的意义上。此时我们需要把左右括号的符号优先级都视作最低,而不是教科书上认为的优先级最高,左括号之所以能无条件进入符号单调递增栈是因为栈深属性比前面的符号更大。也就是左括号使得栈深增大,此后进入符号栈的符号的栈深都比之前的更大。当遇到右括号时,由于优先级最低所以把同栈深的所有符号都弹出参与运算,这样规则就只剩下两条了:1.遇到数字压入数据栈。2.遇到符号,如果(栈深,优先级)比符号栈顶元素高直接入符号栈,否则弹出所有(栈深,优先级)不大于该符号的所有符号栈顶元素,与数据栈弹出的数据参与计算后压入数据栈。

如此我们通过维护符号栈的单调性就能够达到计算表达式的目的。算法步骤:1.分解表达式,得到一些列由数字与符号构成的输入列表。2.遍历列表中的符号元素,计算每个符号的(栈深,优先级)属性,将符号替换成(栈深,优先级,符号)三元组。3.依次处理输入列表中的每个元素,数字进入数字栈,符号维护符号栈的(栈深,优先级)属性单调递增。4.输入结束后,从数字栈顶取出最终结果。

评论 (0)