总结一下利用栈实现前缀、中缀、后缀表达式之间的转换规则。
1.中缀转后缀
先画个栈存放操作符,再从左到右扫描中缀表达式,如果遇到操作数,直接把它从左往右写出来,如果遇到操作符,就把它入栈,但在入栈前先做一样工作,就是把它和栈顶运算符做比较,如果它的优先级小于或等于栈顶运算符,则栈顶运算符出栈,并写到当前结果的运算表达式的右边。若大于,则入栈。若栈空,直接入栈。遇到括号的情况,若遇到左括号,直接入栈。当栈顶元素是左括号的时候,所有扫描到的运算符都入栈。当扫描到右括号的时候,则执行一系列的出栈操作,把栈中所有的在左括号之前的元素全部出栈并加入表达式中,括号直接扔掉。当扫描完所有字符时,若栈中还有运算符,则全部出栈并加入表达式中。
2.中缀转前缀
和中缀转后缀的过程相似,但有所不同的是,从右往左扫描,遇到右括号则右括号入栈,遇到左括号时则把栈中左括号之前的运算符全部出栈。表达式写的时候是从右往左写出来。当扫描到的运算符优先级小于栈顶运算符时,栈顶运算符出栈,当前运算符入栈。
3.后缀转前缀
这个的转化跟前面两个不一样,还有,无论是后缀表达式还是前缀表达式中都没含有括号,所以不需要处理括号。做法是从左到右扫描,当遇到运算数时,将该运算数入栈,当遇到运算符时,对栈做两次弹出操作,然后依次写出“操作符 第二弹出元素 栈顶元素”,然后将这个整体式子压入栈中,再次重复操作。
4.中缀表达式求值
要设置两个栈,一个存操作数,一个存运算符,从左向右扫描,当扫描到操作数时,将操作数压入栈,当扫描到运算符时,先比较栈顶运算符和当前运算符的优先级,若栈顶运算符优先级小于当前运算符,则将运算符入栈,否则将栈顶运算符弹出,并弹出操作数栈的两个元素,进行运算后重新压入操作数栈。当遇到左括号时,将其压入栈,直到遇到右括号时,陆续将栈中在左括号之前的所有运算符出栈运算。
5.后缀表达式求值
只需要设置一个栈,从左往右扫描,当遇到操作数时,将其压入栈中,当遇到运算符时,弹出栈中两个元素,进行运算,并将运算结果重新压入栈中,重复这些操作过程即可!
6.前缀表达式求值
前缀表达式的求值与后缀表达式的求值类似,不过前缀表达式是从右往左开始扫描。