前缀、中缀和后缀表达式详解,中缀表达式到后缀表达式的转换规则,以及后缀表达式的计算规则,附计算代码

本文详细讲解了中缀表达式、前缀表达式和后缀表达式(逆波兰式),重点介绍了如何将中缀表达式转换为后缀表达式,并给出了具体的转换规则和计算过程。通过示例展示了中缀表达式 3 * (11 - 8) - 45 / ((98 - 60) / 10 + 6) 转换为后缀表达式和计算结果的过程。
摘要由CSDN通过智能技术生成

1. 中缀、前缀和后缀表达式

1.1 中缀表达式

首先,中缀表达式的这个“缀”指运算符在两个操作数的位置。中缀表达式其实就是我们常用的算术表达式,比如 2 + 9 - (32 * (19 - 4) +14),我们很容易就可以得到计算结果,但是对于计算机来说,它们就得对各个运算符进行优先级比较以及弹栈和入栈等操作,其实计算机对于前缀表达式和后缀表达式更容易理解

1.2 前缀表达式

前缀表达式,也称波兰式,指运算符处于两个操作数的前面,比如 2 + 3,那么前缀表达式就是 + 2 3;对于复杂点的表达式,如 13 * ((3 + 8) * 4),前缀表达式为 * 13 * + 3 8 4,后续分析怎么转换

1.3 后缀表达式

也称逆波兰式,指运算符处于两操作数后面,比如 2 + 3,后缀表达式为 2 3 +;对于复杂点的表达式,如 13 * ((3 + 8) * 4),后缀表达式为 13 3 8 + 4 * *,后续会讲怎么转换

 

2. 中缀表达式到后缀表达式的转换规则

前面我们提到计算机易于理解前缀表达式和后缀表达式,但我们生活中或使用计算器时是中缀表达式,这也就意味着我们需要将中缀表达式转换为前缀或后缀表达式,从而实现计算器的高效计算。

中缀表达式转换为后缀表达式的规则如下:

1.创建运算符栈s1和操作数数组a2,然后扫描中缀表达式;

2.如果是操作数,直接放入数组a2;

3.如果是运算符,栈s1为空或栈顶符号为左括号,或者优先级比栈顶运算符高,则入栈结束该步骤;否则将s1栈顶运算符弹出放入操作数数组a2,
 然后重复该步骤3。

4.如果是左括号,直接压入运算符栈s1;如果是右括号,依次弹出s1的运算符放入s2,直至遇到左括号结束,并将左、右括号舍弃。

5.循环步骤2-4直至表达式扫描结束,将s1的剩余运算符依次弹出放入数组a2,数组a2就是后缀表达式。

以下演示一个较复杂中缀表达式 3 * (11 - 8) - 45 / ((98 - 60) / 10 + 6)  转换后缀表达式的流程,流程如下。

1. 先创建运算符栈s1,和操作数数组a2,然后索引指向中缀表达式的第一位;

2. 3是操作数,放入数组a2的第一个位置,得到a2 = {3};

3. *是运算符,因为栈s1为空,*直接入栈s1,s1 =

4. 遇到左括号,直接压入运算符栈s1,s1 = 

5. 11是操作数,直接放入数组a2,得到a2 = {3, 11};

6. - 是运算符,因为栈顶符号是左括号,- 直接入栈得到s1 = 

7. 8是操作数,直接放入数组a2,得到a2 = {3, 11, 8};

8. 遇到右括号,弹出s1中的运算符 - ,直到遇到左括号结束;此时a2={3, 11, 8, -},s1 = 

9. - 是运算符,因为优先级低于栈顶符号 * ,将s1栈顶符号弹出放入数组a2,a2变为{3, 11, 8, -, *},s1 = 

10. 重复步骤3,由于此时栈为空,则 - 直接入栈,s1 = 

11. 45是操作数,直接放入数组a2,得到a2 = {3, 11, 8, -, *, 45};

12. / 是运算符,而且运算优先级高于s1的栈顶符号 -,所以直接入栈,s1 = 

13. 遇到左括号,直接压入运算符栈s1,s1 = 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值