概述
前缀、中缀、后缀表达式是表达式的不同记法,其区别在于运算符相对于操作数的位置,前缀表达式的运算符位于操作数之前,中缀表达式的运算符位于操作数中间,表达式的运算符位于操作数之后,
如:
- 中缀表达式:1+2-3×4
- 前缀表达式:- + 1 2 × 3 4 (最后一个运算符与右边两个操作数结合进行运算,依次计算下去)
- 后缀表达式:3 4 × 1 2 + - (第一个运算符与左边两个操作数结合进行运算,依次计算下去)
中缀表达式
- 中缀表达式是一种通用的算术或逻辑公式表示方法,运算符位于操作数的中间。中缀表达式是我们常用的表达式。
- 因为我们平时经常使用中缀表达式,所有我们对中缀表示式比较熟悉;但中缀表达式对计算机来说却是很难理解的;所以计算机在计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。
前缀表达式
前缀表达式的运算符位于两个相应操作数之前,前缀表达式又被称为前缀记法或波兰式,前缀表达式没有括号,因为其已经含有运算顺序,
计算机计算过程
-
从右往左扫描表达式扫到数字就让数字入栈,
-
扫到运算符就让栈顶的两个数出栈,用该运算符对它们做相应的计算,并将结果入栈
-
重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果
-
用一句话概述:最后一个运算符与右边两个操作数结合进行运算,依次计算下去
例:
列出求解表达式- + 1 2 × 3 4的过程- 从右往左扫描表达式,将扫到的数字4 3入栈
- 扫到 * 运算符,将3 4出栈,执行3×4,并将结果12入栈
- 继续扫描,将表达式数字2 1入栈,
- 扫到 + 运算符,将1 2出栈,执行1+2,并将结果3入栈
- 扫到 - 运算符,将3 12出栈,执行3-12,结果-9为表达式解
中缀表达式转化为前缀表达式
- 按照运算符的优先级对所有的运算单位加括号,如(1+2)
- 将运算符移动到对应括号的前面,如+(1 2)
- 去掉括号,得到后缀表达式,如+ 1 2
例:
将中缀表达式:2/1-3×4转化为前缀表达式
1、加括号
((2/1)-(3×4))
2、移动运算符
-((/21)(×34))
3、去掉括号
前缀表达式: - / 2 1 × 3 4
后缀表达式
前缀表达式的运算符位于两个相应操作数之前,后缀表达式也被称为后缀记法或逆波兰式,后缀表达式没有括号,因为其已经含有运算顺序,
计算机计算过程
计算过程与前缀表达式类似,只是顺序是从左至右:
- 从左至右扫描表达式遇到数字时,将数字压入堆栈,
- 遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素op 栈顶元素 ),并将结果入栈
- 重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果
- 用一句话概述:最后一个运算符与右边两个操作数结合进行运算,依次计算下去
例:
列出求解表达式3 4 * 1 2 + - 的过程- 从左往右扫描表达式,将扫到的数字3 4入栈
- 扫到 * 运算符,将4 3出栈,执行4*3,并将结果12入栈
- 继续扫描,将表达式数字1 2入栈,
- 扫到 + 运算符,将2 1出栈,执行2+1,并将结果3入栈
- 扫到 - 运算符,将3 12出栈,执行3-12,结果-9为表达式解
中缀表达式转化为后缀表达式
方法一 直接法
- 按照运算符的优先级对所有的运算单位加括号,如(1+2)
- 将运算符移动到对应括号的后面,如(1 2)+
- 去掉括号,得到后缀表达式,如1 2+
例:
将中缀表达式:2/1-3×4转化为后缀表达式
1、加括号
((2/1)-(3×4))
2、移动运算符
((21/)(34×))-
3、去掉括号
后缀表达式:2 1 / 3 4 × -