
从左到右依次扫描中缀表达式
遇到元素为数字直接输出
遇到算数运算符入栈
遇到”(“入栈
遇到”)”, 匹配左括号,所以栈顶元素依次出栈,直到”(“, 左括号也要出栈,然后直接扔掉,不放于结果后
遇到符号,但栈顶符号优先大于当前元素,所以出栈〈栈中符号优先级如果都不小于当前元素则全部出栈)。当前元素入栈。
最后如果栈中还有元素,则栈中符号依次出栈。
如果栈顶元素的优先级和当前遍历元素优先级一样呢?
根据运算符的结合性来决定:
- 左结合运算符(如
+ - \* /
)- 先将栈顶元素出栈并输出
- 再将当前运算符入栈
- 右结合运算符(如
^
)- 直接将当前运算符入栈,不弹出栈顶元素
这样保证了表达式转换为后缀表达式(逆波兰表达式)时,运算的先后顺序不会改变。