前缀---中缀--后缀 表达式的相互转换

34 篇文章 0 订阅
28 篇文章 0 订阅

一般我们平时用的计算式都是中缀表达式,因为符号都是在操作数的中间的。相对应的符号在操作数后面的就叫后缀表达式,符号在操作数前面的就叫前缀表达式。

那么他们之间如何转换呢?这里给一个例子:

【1】将中缀表达式“1+((2+3)*4)-5”转换为前缀表达式。

(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
逆缀输出字符串

前缀表达式逆向求解中缀表达式

 

【2】中缀表达式转换为后缀表达式

过程和【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 - +
逆缀输出字符串

 

后缀表达式逆向求解中缀表达式

1 2 3 + 4 *5 - +
基本思路和上面的一样:递归,碰到操作符就进入递归。
从左往右扫描先碰到+号,取+号前面两个操作数:2,3 得到:2+3.
继续往下扫碰到*号,取4 和2+3 得到:(2+3)*4
-号,取(2+3)*4和5得到::(2+3)*4-5
+号:取(2+3)*4-5和1得到::1+(2+3)*4-5
  • 10
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值