栈的应用-中缀表达式转后缀表达式
思路:我们拿到中缀表达式之后,从左到右遍历中缀表达式中的数字和运算符,如果遇到数字我们就直接把数字输出,如果遇到的是运算符,就需要判断它和栈顶运算符的优先级,如果他的优先级高于栈顶元素的优先级,就直接将其入栈,如果他的优先级低于或等于栈顶元素的优先级,就输出栈顶运算符,并将当前符号入栈。
例:中缀 “9 + ( 3 - 1 ) × 3 + 10 ÷ 2”转后缀的过程
1、创建一个空栈,为下面做铺垫
2、遍历中缀表达式,第一个是数字9,直接输出,第二个是运算符“ + ”,将“ + ”入栈。
3、接下来是左括号,遇到左括号直接入栈。
4、接下来是3,3直接输出,3之后是运算符“—”,将其入栈,之后是1,将将1输出,如下图
这里要注意,加减乘除运算符不与括号的优先级作比较。
5、后面是“)”,右括号要找“(”与之匹配,将左括号和右括号中间的运算符依次输出,在这里,双括号里面只有“—”号,所以只输出“—”,如下图:
在这里要注意,我们输出的括号里面的运算符,括号是出栈但不输出。
6、接下来是“ד,比较”ד与栈顶元素的优先级,发现优先级高于栈顶符号就直接入栈,在之后是数字3,将其直接输出,此时如下图:
7、之后是运算符” + “,比较” + “与栈顶元素的优先级,发现” + “的优先级低于运算符”ד,就把” × “输出,接着比较” + “与栈顶元素的优先级,发现” + “和” + “相等,也同样输出栈顶元素,然后将我们的运算符入栈。如下图:
此处栈内的+是表达式“9 + ( 3 - 1 ) × 3 + 10 ÷ 2”中第二个+
8、接下来是10 ,直接输出,在之后是”÷“,他的优先级比栈顶元素的优先级高,直接入栈,如图:
9、之后是2,直接输出,发现已经遍历结束,此时将栈内元素输出,结果如下