举一个中缀表达式的例子: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.遇到的是运算符('+'、'-'、'*'、'/'),有三种情况
①如果栈为空,直接入栈。
②如果栈顶元素是左括号'(',直接入栈。
③如果栈顶元素是运算符,则需要进行比较,
1-如果优先级大于栈顶运算符,则压入堆栈;
2-如果优先级小于等于栈顶运算符,则将栈顶运算符弹出并输出,然后比较新的栈顶运算符,直到优先级大于栈顶运算符或者栈空,再将该运算符入栈
5.如果对象处理完毕,则按顺序弹出并输出栈中所有运算符
算法如下:
<