最常见人们最熟悉的运算表达式就是中缀表达式,例如(3+4)*5/6就是中缀表达式。但是计算机很难处理中缀表达式,所以往往需要转换成后缀表达式处理。
又叫逆波兰表达式,运算符位于操作数之后,例如中缀表达式(3+4)*5/6的后缀表达式写法为3 4+5*6/。
* = / > + = - > ( = )(,入栈(在栈中时,优先级最低)。),将所有栈顶元素依次出栈,添加至后缀表达式中,直到第一个(出栈以中缀表达式(3+4)*5/6为例
| 步骤 | 扫描元素 | 栈 | 后缀表达式 | 说明 |
|---|---|---|---|---|
| 1 | ( |
( |
` ` | (入栈 |
| 2 | 3 |
( |
3 |
数字3加入表达式 |
| 3 | + |
( + |
3 |
+入栈 |
| 4 | 4 |
( + |
3 4 |
数字4加入表达式 |
| 5 | ) |
3 4 + |
扫描到)闭合括号,将所有顶元素依次出栈,+加入表达式 |
|
| 6 | * |
* |
3 4 + |
*入栈 |
| 7 | 5 |
* |
3 4 + 5 |
数组5加入表达式 |
| 8 | / |
/ |
3 4 + 5 * |
*出栈加入表达式,/入栈 |
| 9 | 6 |
/ |
3 4 + 5 * 6 |
数字6加入表达式 |
| 10 | / |
3 4 + 5 * 6 / |
表达式结束,所有元素出栈加入表达式 |
次顶元素 运算符 栈顶元素以后缀表达式3 4+5*6/为例
| 步骤 | 扫描元素 | 栈 | 说明 |
|---|---|---|---|
| 1 | 3 |
3 |
数字3入栈 |
| 2 | 4 |
3 4 |
数字4入栈 |
| 3 | + |
7 |
遇到运算符,弹出4 3,+运算获得7并入栈 |
| 4 | 5 |
7 5 |
数字5入栈 |
| 5 | * |
35 |
遇到运算符,弹出5 7,*运算获得35并入栈 |
| 6 | 6 |
35 6 |
数字6入栈 |
| 7 | / |
遇到运算符,弹出6 35,/运算获得5.8333 |
前缀表达式又称为波兰表达式,与后缀表达式相反,前缀表达式的运算符位于操作数之前,例如中缀表达式(3+4)*5/6的前缀表达式写法为/*+3 4 5 6。
栈顶元素 运算符 次顶元素以前缀表达式/*+3 4 5 6为例
| 步骤 | 扫描元素 | 栈 | 说明 |
|---|---|---|---|
| 1 | 6 |
6 |
数字6入栈 |
| 2 | 5 |
6 5 |
数字5入栈 |
| 3 | 4 |
6 5 4 |
数字4入栈 |
| 4 | 3 |
6 5 4 3 |
数字3入栈 |
| 5 | + |
6 5 7 |
遇到运算符,弹出3 4,+运算获得7并入栈 |
| 6 | * |
6 35 |
遇到运算符,弹出7 5,*+*运算获得35并入栈 |
| 7 | / |
6 |
遇到运算符,弹出35 6,/运算获得5.8333 |