(中缀)表达式转换成前缀表达式、后缀表达式

认识前缀、中缀、后缀表达式:
一般我们平时用的计算式都是中缀表达式,因为符号都是在操作数的中间的。相对应的符号在操作数后面的就叫后缀表达式(也称逆波兰式),符号在操作数前面的就叫前缀表达式(也称波兰式)。


为什么要把中缀表达式转化为后缀,前缀?

计算机没法计算带有括号,以及区分优先级的表达式,或者说很难计算。使用后缀,前缀,消除了括号和优先级。

计算机如何计算后缀,前缀表达式?

计算后缀:从左到右遍历后缀表达式,遇到操作数,放进栈,遇到操作符,栈顶两个数出栈,进行运算,运算结果放进栈,直到读完后缀表达式。

计算前缀:从左到右遍历前缀表达式,遇到操作符,放进栈,遇到操作数,查看栈顶,栈顶为操作符,放进栈,栈顶为操作数,取出栈顶操作数和操作符,进行运算,运算后继续判断栈顶的情况。

中缀表达式转换成前缀表达式

(1)构建两个栈,一个存运算符一个存操作数。运算符(以括号分界点)在栈内遵循越往栈顶优先级不降低的原则进行排列。

(2)从右至左扫描中缀表达式,从右边第一个字符开始判断:

如果当前字符是数字,则分配到数字串的结尾并将数字串直接输出。

如果是运算符,则比较优先级。如果当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶是括号时,直接入栈),则将运算符直接入栈;否则将栈顶运算符出栈并输出,直到当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶是括号时,直接入栈),再将当前运算符入栈。如果是括号,则根据括号的方向进行处理。如果是右括号,则直接入栈;否则,遇右括号前将所有的运算符全部出栈并输出,遇右括号后将左右的两括号一起删除。

(3) 重复上述操作(2)直至扫描结束,将栈内剩余运算符全部出栈并输出,再逆缀输出字符串。中缀表达式也就转换为前缀表达式了。

中缀表达式转换成后缀表达式

中缀表达式转换成前缀表达式相似


参考:
前缀—中缀–后缀 表达式的相互转换 https://blog.csdn.net/linsheng9731/article/details/23125353
表达式转化(中缀,后缀,前缀) https://www.cnblogs.com/nzbbody/p/3335226.html
将中缀表达式转换成后缀表达式 https://www.cnblogs.com/chenjiafeng/p/5328578.html
前缀、中缀、后缀表达式及中缀转后缀表达式 https://blog.csdn.net/kobe_jr/article/details/80377836

你可能感兴趣的:(#,数据结构与算法)