中序表达式转后序表式式

中序表达式转后序表式式:

将中序表达式所有括号补全,然后将所有运算符向右移出无匹配的第一个右括号,去掉括号即为后序表式式

举例:
原式:a+b*(c+d/e)
补全括号:(a+(b*(c+(d/e))))
操作符右移:(a(b(c(de)/)+)*)+
去掉括号:abcde/+*+

中序表达式转前序表式式:

将中序表达式所有括号补全,然后将所有运算符向左移出无匹配的第一个左括号,去掉括号即为前序表式式

举例:
原式:a+b*(c+d/e)
补全括号:(a+(b*(c+(d/e))))
操作符右移:+(a*(b+(c/(de))))
去掉括号:+a*b+c/de

算法:

利用运算符栈(OPTR)和数据栈(OPND)将中缀表达式转化为后缀表达式。

将结束标志字符’#’放入操作符栈(OPTR); 
从中缀表达式pre左端依次读取pre[i]:

  • 1.若pre[i]为操作数,压入数据栈(OPND);
  • 2.若pre[i]为左括号,压入操作符栈(OPTR);
  • 3.若pre[i]为右括号,则将操作符栈(OPTR)中的运算符依次出栈并压入数据栈(OPND),直到遇到左括号为止,但是该左括号出栈但不压入数据栈(OPND)
  • 4.若pre[i]为操作符
    (1)若操作符栈(OPTR)为空,将此操作符pre[i]压入数据栈(OPND); 
    (2)若pre[i]的优先级大于操作符栈(OPTR)顶的优先级,将此操作符pre[i]压入数据栈(OPND); 
    (3)若操作符栈(OPTR)不为空且pre[i]的优先级小于等于操作符栈(OPTR)顶的优先级,将操作符栈(OPTR)中的运算符依次出栈并压入数据栈(OPND),直到不满足条件,此操作符pre[i]压入数据栈(OPND)

直到遍历完整个中序表达式之后,操作符栈(OPTR)中仍然存在运算符,那么将这些运算符依次出栈加入到数据栈(OPND)中,直到栈为空。

按照上述步骤完成后,将操作符栈(OPTR)逆序即可得到逆波兰表达式。

转载于:https://www.cnblogs.com/wwjldm/p/7155094.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值