前缀表达式、中缀表达式、后缀表达式

前缀表达式(波兰式)

a+((b+c)*d)-e  => -+a*+bcde

中缀表达式

a+((b+c)*d)-e 

后缀表达式(逆波兰式)

a+((b+c)*d)-e  => abc+d*+e-

 

前缀、中缀、后缀的转换过程

方法一:可以将前缀和后缀都转换成中缀表达式树,再相互转换

中缀表达式树使用链表较宜。

* 前缀转中缀表达式树:对前缀字符串Str进行遍历,确定Str[1]符号为根节点,对2..n进行遍历,从左向右构建子树,对于Str[i]Str[i+1],如果Str[i-1]为符号,构建左右子树;Str[i-1]为变量,查找右孩子为空的祖先节点进行构建。可以借助栈或递归方式来完成。(中左右)

* 后缀转中缀表达式树:对后缀字符串的逆序Str进行遍历,确定Str[1]符号为根节点,对2..n进行遍历,从右向左构建子树,对于Str[i]Str[i+1],如果Str[i-1]为符号,构建右左子树;Str[i-1]为变量,查找左孩子为空的祖先节点进行构建。可以借助栈或递归方式来完成。

(中右左)

中缀表达式树通过前序和后续遍历得到前缀表达式和后缀表达式。

 

方法二:使用栈进行转换,栈的数据元素存放字符串。

 

方法三:使用符号和字符两个栈。

* 中缀转前缀:对中缀字符串Str从右向左遍历。

    1. Str[i]为字符,直接输入字符栈。

    2. Str[i]为运算符,与符号栈顶元素进行比较。大于等于栈顶符号优先级,push入符号栈;否则,pop栈顶符号并插入字符栈。

    3. Str[i]为括号。如果为右括号,直接插入符号栈;否则,弹出逐个弹出符号栈中的元素并插入字符栈,直到右括号为止。

    重复以上步骤至Str为空,弹出字符栈即为前缀表达式。

* 中缀转后缀:对中缀字符串Str从左向右遍历。与中转前类似。

 

未完待续。。。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值