举一个中缀表达式的例子:a+b-a*((c+d)/e-f)+g
一、中缀表达式转后缀表达式
方法一:括号法
比较简单方便。
①按照运算符的优先级,对所有的运算单位加括号。
于是变成:(((a+b)-(a*(((c+d)/e)-f)))+g)
②从最里面的括号开始,依次把运算符号移动到对应的括号的后面。
于是变成:(((ab)+(a(((cd)+e)/f)-)*)-g)+
③最后,把括号都去掉
于是变成:ab+acd+e/f-*-g+
方法二:利用语法树
略。
方法三:基于堆栈的算法
具体转换方式:
从左到右进行遍历。
1.遇到的是运算数,直接输出。
2.遇到的是左括号'(',直接压入堆栈(括号是最高优先级,无需比较;入栈后优先级降到最低,确保其他符号正常入栈)。
3.遇到的是右括号')',意味着括号已结束。不断弹出栈顶运算符并输出,直到遇到左括号,这个左括号弹出但是不输出。
4.遇到的是运算符('+'、'-'、'*'、'/'),有三种情况
①如果栈为空,直接入栈。
②如果栈顶元素是左括号'(',直接入栈。