目录
1、概念解析
前缀表达式:一种没有括号的算术表达式,将运算符写在前面,操作数写在后面,也称为“波兰式”,如
中缀表达式:平常的算术表达式,如
后缀表达式:又称“逆波兰式”,与前缀表达式相似,运算符写在操作数后面,如
2、表达对照
波兰式 | 中缀表达式 | 逆波兰式 |
+ab | a+b | ab+ |
+a-bc | a+(b-c) | abc-+ |
+a*-bcd | a+(b-c)*d | abc-d*+ |
+a*d-bc | a+d*(b-c) | adbc-*+ |
=a+13 | a=1+3 | a13+= |
3、相互转化
3.1中缀->波兰式
假设中缀表达式为,转化过程如下:
- 按照运算符的优先级给所有运算单位加括号:
- 按照运算顺序将运算符号移至对应括号前面:
- 去括号得结果:
3.2中缀->逆波兰式
假设中缀表达式为,转化过程如下:
- 按照运算符的优先级给所有运算单位加括号:
- 按照运算顺序将运算符号移至对应括号后面:
- 去括号得结果:
4、计算机求值过程
4.1波兰式
从右至左扫描表达式,遇到数字时,将数字压入堆栈,晕倒运算符时,弹出栈顶的两个数,用运算符对他们做相应运算(栈顶元素和次顶元素),并将结果入栈;重复上述过程直至表达式最左端,最后运算出的值即为表达式结果。
例如:的波兰式为,针对此波兰式求值步骤为:
- 从右至左扫描,将6、5、4、3压入堆栈;
- 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素),计算出3+4的值得7,再将7入栈;
- 接下来是*运算符,因此弹出7和5,计算7*5=35,将35入栈;
- 最后是-运算符,计算出35-6=29,由此得出计算结果。
4.2逆波兰式
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇倒运算符时,弹出栈顶的两个数,用运算符对他们做相应运算(栈顶元素和次顶元素),并将结果入栈;重复上述过程直至表达式最右端,最后运算出的值即为表达式结果。
例如:的逆波兰式为,针对此逆波兰式求值步骤为:
- 从左至右扫描,将3和4压入堆栈;
- 遇到+,因此弹出4和3,计算4+3=7,将7入栈;
- 将5入栈;
- 接下来是*运算符,因此弹出5和7,计算5*7=35,将35入栈;
- 将6入栈;
- 最后是-运算符,计算35-6=29,由此得出计算结果。