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

               

前缀表达式(波兰式)

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从左向右遍历。与中转前类似。

 

未完待续。。。

           

猜你喜欢

转载自blog.csdn.net/qq_44952707/article/details/89476804