最常见人们最熟悉的运算表达式就是中缀表达式,例如(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 |