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

引入波兰式与逆波兰式:

一个式子,可以分成几个层面来看。比如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))

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言中将表达式转化为波兰式逆波兰式的方法是使用栈来实现。波兰式(前缀式)指的是运算符号位于其对应的操作数之前,而逆波兰式(后缀式)指的是运算符号位于其对应的操作数之后。 将中缀表达式转换为前缀或后缀表达式可以通过以下步骤进行: 1. 创建一个符号栈(Stack)和一个结果队列(Queue)。 2. 从左到右扫描中缀表达式,若遇到操作数,将其加入到结果队列中。 3. 若遇到运算符,比较其与栈顶运算符的优先级,若优先级低于栈顶元素,则将栈顶元素弹出并加入到结果队列中,直接层层递进,直到遇到比该元素优先级较低的元素为止。 4. 若遇到左括号“(”,则将其入栈。 5. 若遇到右括号“)”,则依次弹出栈顶元素,加入到结果队列中,直到左括号“(”被弹出。注意:左括号“(”不加入到结果队列中。 6. 最后,如果符号栈中仍有元素,则依次弹出加入到结果队列中。 7. 若要将中缀表达式转换逆波兰式,则将符号栈改为栈,并将操作数加入到栈中。 8. 遇到运算符时,弹出栈顶的两个操作数进行计算,并将结果压入栈中。 9. 最后栈中仅剩一个元素,即为逆波兰式。 注意事项: 在将中缀表达式转换为前缀表达式时,我们需要先将中缀表达式翻转,再按照转换成后缀表达式的方法进行。 在计算逆波兰式时,需要注意操作数的顺序,因为后缀式在操作数的顺序上没有明确的要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值