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 =
;
14. 遇到左括号,直接压入运算符栈s

本文详细讲解了中缀表达式、前缀表达式和后缀表达式(逆波兰式),重点介绍了如何将中缀表达式转换为后缀表达式,并给出了具体的转换规则和计算过程。通过示例展示了中缀表达式 3 * (11 - 8) - 45 / ((98 - 60) / 10 + 6) 转换为后缀表达式和计算结果的过程。
最低0.47元/天 解锁文章
1828





