大家好,欢迎来到IT知识分享网。
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 =
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/121022.html




