一、前缀表达式
(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 -”