波兰式,逆波兰式,中缀表达式相互转换

引入波兰式与逆波兰式:

一个式子,可以分成几个层面来看。比如1 + 2 * 3,我们看它是个算式,计算机看它,那就是个字符串,所以首先必须把它拆分成计算机可以操作的数据单元,就是Tokenize。比如1 2 3是操作数,+ 和*是操作符。但是这还不够,算式有优先级之分,先算乘除,后算加减,也就是算式这种人类描述数学式子的语言,有其自身的文法,所以对于一个算式,我们还得对这个式子再做分析,就是Parser。人类发明的语言,计算机分析起来麻烦点,因为计算机处理字符串是从左到右流式的,不像人,先看看后面再看看前面都可以。比较适合计算机处理的是什么样的呢?

中缀表达式:

人类最熟悉的一种表达式1+2,(1+2)*3,3+4*2+4等等都是中缀表示法。即运算符在两个操作数中间,对于人们来说,是最直观的一种求值方式,先算括号里的,然后算乘除,最后算加减,但是,计算机处理中缀表达式却并不方便。由此我们引入了波兰式与逆波兰式。

波兰式与逆波兰式:

波兰式:即前缀表达式,是一种将运算符写在操作数之前的表达式。

逆波兰式:即后缀表达式,是一种将运算符写在操作数之后的表达式。

中缀表达式与波兰式,逆波兰式间的转化:

表达式:x=a+b*(c-d)/e,求它的波兰式与逆波兰式

下面我将给出一种较简便的方法求中缀表达式与波兰式与逆波兰式的转换:

1.根据优先级加括号,这里表达式可化为:x=a+(b*(c-d))/e -> x=a+((b*(c-d))/e) ->x=(a+((b*(c-d))/e)) -> (x=(a+((b*(c-d))/e)))

2.从里到外遍历括号,将运算符放在操作数前/(后)。 即:(x=(a+((b*-(cd))/e))) -> (x=(a+((b-(cd))/e)) ) -> (x=(a+(/(b-(cd))e))) -> ( x=+(a(/(b-(cd))e))) -> =(x+(a(/(b-(cd))e)))

3.去掉所有的括号。即 =x+a/*b-cde

同理,我们可以求得它的逆波兰式为:xabcd-*e/+=

如何将一个波兰式或逆波兰式化为中缀表达式呢?

1.左至右读入表达式,如果一个操作符后面跟着两个操作数时,则从左(右)边取出两个操作数做计算。

2.然后将这个结果作为操作数替换这个操作符和两个操作数。

3.重复此步骤,直至所有操作符处理完毕。

4.为避免优先级错误,每次取一个运算符时加一对括号.

例:将逆波兰式 a b c d / - * 转化为中缀表达式

a b c d / - * -> a b (c/d) - * -> a (b-c/d) * -> ( a*(b- c/d))

你可能感兴趣的:(波兰式,逆波兰式,中缀表达式相互转换)