一般我们平时用的计算式都是中缀表达式,因为符号都是在操作数的中间的。相对应的符号在操作数后面的就叫后缀表达式,符号在操作数前面的就叫前缀表达式。
那么他们之间如何转换呢?这里给一个例子:
(1)构建两个栈,一个存运算符一个存操作数。运算符(以括号分界点)在栈内遵循越往栈顶优先级不降低的原则进行排列。
(2)从右至左扫描中缀表达式,从右边第一个字符开始判断:
如果当前字符是数字,则分配到数字串的结尾并将数字串直接输出。
如果是运算符,则比较优先级。如果当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶是括号时,直接入栈),则将运算符直接入栈;否则将栈顶运算符出栈并输出,直到当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶是括号时,直接入栈),再将当前运算符入栈。如果是括号,则根据括号的方向进行处理。如果是右括号,则直接入栈;否则,遇右括号前将所有的运算符全部出栈并输出,遇右括号后将左右的两括号一起删除。
(3) 重复上述操作(2)直至扫描结束,将栈内剩余运算符全部出栈并输出,再逆缀输出字符串。中缀表达式也就转换为前缀表达式了。
中缀表达式
|
前缀表达式
|
(栈顶)运算符栈(栈尾)
|
说明
|
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】差不多,只不过是从左往右扫描,方向换了一个,其他一样。
还是这个式子:1+((2+3)*4)-5
中缀表达式
|
后缀表达式
|
(栈顶)运算符栈(栈尾)
|
说明
|
1
|
1
|
空
|
1,是数字串直接输出
|
+
|
1
|
+
|
+,栈内无运算符,直接入栈
|
(
|
1
|
+(
|
(,直接入栈
|
(
|
1
|
+((
|
(,直接入栈
|
2
|
1 2
|
+((
|
2 ,数字
|
+
|
1 2
|
+((+
|
+,直接入栈
|
3
|
1 2 3
|
+((+
|
3,是数字串直接输出
|
)
|
1 2 3 +
|
+(
|
碰到 )找到(之前所有符号弹出出
|
*
|
1 2 3 +
|
+(*
|
*
|
4
|
1 2 3 + 4
|
+(*
|
4
|
)
|
1 2 3 + 4 *
|
+
|
碰到 )找到(之前所有符号弹出出
|
-
|
1 2 3 + 4 *
|
+ -
|
-
|
5
|
1 2 3 + 4 *5
|
+ -
|
5
|
空
|
1 2 3 + 4 *5 - +
|
空
|
扫描结束
|
空
|
1 2 3 + 4 *5 - +
|
空
|
逆缀输出字符串
|
前缀---中缀--后缀 表达式的相互转换,布布扣,bubuko.com
原文:http://blog.csdn.net/linsheng9731/article/details/23125353