一、根据运算符的优先级加括号法
举例:中缀表达式求后缀表达式
a+b*(c-d)-e/f
- 根据运算符的优先级给表达式加上括号 ((a+(b*(c-d)))-(e/f))
- 将最外层的符号先提取到对应括号的右侧:(前缀表达式与之相反,是将运算符移动到对应括号的左侧,不再举例)
- ((a+(b*(c-d)))(e/f))— ) //相对整个表达式来讲 这个减号是最外层的运算符
- ((a(b*(c-d)))+(ef))— ) //从左向右这个+属于最外层
- ((a(b*(c-d)))+(ef)/)— )//....
- ((a(b(c-d))*)+(ef)/)—)//...
- ((a(b(cd)-)*)+(ef)/)—)//...
- abcd-*+ef/- //最后去掉所有的括号
- 其实也不用管那个是属于最外层的,只要把符号移动到对应的括号右边就行
二、利用栈来求后缀表达式(求前缀表达式也一样,只不过是从右往左遍历中缀表达式,并将每次遇到的操作数或弹出的运算符写在当前操作数或运算符的左侧)
中缀表达式求后缀表达式:
a+b*(c-d)-e/f
- 从左到右将遇到的运算符入栈,遇到操作数直接将其写下来就行
- 在将运算符入栈的时候先看看是否即将入栈的运算符优先级是否高于栈顶运算符的优先级,如果高则直接入,如果低,那么就进行出栈,直到栈顶的运算符优先级低于即将要入的运算符优先级,将弹出的运算符 跟在刚刚的操作数后面就行。
- 如果入栈的时候运算符是右括号那么就出栈,直到出栈遇到左括号再停止出栈
三、将中缀表达式画成二叉树,然后对其进行前序和后序遍历即可
- 先从右向左遍历中缀表达式,找到从右到左的第一个优先级最低的运算符来做二叉树的根,确定根之后那么它的左右子树基本确定,然后第二次遍历中缀表达式找第二优先级最低的运算符,然后根据刚刚的大致位置确定第二最低优先级运算符的位置