一、前缀表达式
(1)定义
前缀表达式是一种没有括号的算术表达式,其将运算符写在前面,操作数写在后面。例如表达式1-(2+3)的前缀表达式是- 1 + 2 3。
(2)求值方法
对前缀表达式求值,要从右至左扫描表达式,首先从右边第一个字符开始判断,若当前字符是数字则一直到数字串的末尾再记录下来,若为运算符,则将右边离得最近的两个“数字串”作相应运算,然后以此作为一个新的“数字串”并记录下来;扫描到表达式最左端时扫描结束,最后运算的值即为表达式的值。
例如:对前缀表达式“- 1 + 2 3”求值,扫描到3时,记录下这个数字串,扫描到2时,记录下这个数字串,当扫描到+时,将+右移做相邻两数字串的运算符,记为2+3,结果为5,记录下5这个新数字串,然后继续向左扫描,扫描到1时,记录下这个数字串,扫描到-时,将-右移做相邻两数字串的运算符,记为1-5,结果为-4,此时关于这个表达式的全部运算已完成,故表达式的值为-4。
(3)中缀表达式转化为前缀表达式
方法:从右往左扫描
例子:将中缀表达式“1+((2+3)*4)-5”转换为前缀表达式:
|
中缀表达式 |
前缀表达式 |
(栈顶)运算符栈(栈尾) |
说明 |
|
5 |
5 |
空 |
5,是数字串直接输出 |
|
- |
5 |
- |
-,栈内无运算符,直接入栈 |
|
) |
5 |
-) |
),直接入栈 |
|
4 |
5 4 |
-) |
4,是数字串直接输出 |
|
* |
5 4 |
-)* |
*,栈顶是括号,直接入栈 |
|
) |
5 4 |
-)*) |
),直接入栈 |
|
3 |
5 4 3 |
-)*) |
3,是数字串直接输出 |
|
+ |
5 4 3 |
-)*)+ |
+,栈顶是括号,直接入栈 |
|
2 |
5 4 3 2 |
-)*)+ |
2,是数字串直接输出 |
|
( |
5 4 3 2 + |
-)* |
(,与栈里最后一个)抵消,并释放它们之间的+ |
|
( |
5 4 3 2 + * |
- |
(,方法与上类同,请参考下一目录 |
|
+ |
5 4 3 2 + * |
-+ |
+,优先级大于等于栈顶运算符,直接入栈 |
|
1 |
5 4 3 2 + * 1 |
-+ |
1,是数字串直接输出 |
|
空 |
5 4 3 2 + * 1 + - |
空 |
扫描结束,将栈内剩余运算符全部出栈并输出 |
|
空 |
- + 1 * + 2 3 4 5 |
空 |
逆缀输出字符串 |
二、中缀表达式
(1)定义
是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3+4),中缀表达式是人们常用的算术表示方法。
(2)中缀表达式“8+4-6*2”用后缀表达式表示为:8 4 + 6 2 * -
(3)中缀表达式“2*(3+5)+7/1-4”用后缀表达式表示为:3 5 + 2 * 7 1 /4 - +
三、后缀表达式
(1)定义
不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不在考虑运算符的优先规则),如:(2+1)*3,即2 1 + 3 *
(2)中缀表达式转换为后缀表达式
思想:
开始扫描(从左往右);
数字时,加入后缀表达式;
运算符:
a. 若为’(‘,入栈
b. 若为’)’,则依次把栈中的运算符加入后缀表达式中,直到出现’(‘,从栈中删除’(‘;
c. 若为除括号外的其他运算符,当其优先级高于除’(‘以外的栈顶运算符时,直接入栈。否则从栈顶开始,依次弹出比当前处理的运算符优先级高和优先级相等的运算符,直到一个比它优先级低的或者遇到了一个左括号为止。
例子,将中缀表达式“1+((2+3)*4)-5”转换为后缀表达式的过程如下:
|
中缀表达式 |
后缀表达式 |
(栈顶)运算符栈(栈尾) |
说明 |
|
1 |
1 |
空 |
数字直接入栈 |
|
+ |
1 |
+ |
栈为空,直接入栈 |
|
( |
1 |
+ ( |
左括号,直接入栈 |
|
( |
1 |
+ ( ( |
左括号,直接入栈 |
|
2 |
1 2 |
+ ( ( |
数字直接入栈 |
|
+ |
1 2 |
+ ( ( + |
栈顶为左括号,运算符直接入栈 |
|
3 |
1 2 3 |
+ ( ( + |
数字直接入栈 |
|
) |
1 2 3 + |
+ ( |
右括号,弹出运算符直至遇到左括号 |
|
* |
1 2 3 + |
+ ( * |
栈顶是左括号,运算符直接入栈 |
|
4 |
1 2 3 + 4 |
+ ( * |
数字直接入栈 |
|
) |
1 2 3 + 4 * |
+ |
右括号,弹出运算符直至遇到左括号 |
|
- |
1 2 3 + 4 * + |
- |
-与+优先级相同,因此弹出+,再压入- |
|
5 |
1 2 3 + 4 * + 5 |
- |
数字直接入栈 |
|
空 |
1 2 3 + 4 * + 5 - |
空 |
剩余的运算符 |
因此结果为“1 2 3 + 4 * + 5 -”
本文详细介绍了算术表达式的三种形式:前缀、中缀和后缀表达式的基本概念及相互转换方法。包括如何将中缀表达式转换为前缀或后缀表达式,以及如何计算这些表达式的值。

1万+

被折叠的 条评论
为什么被折叠?



