带有数字的中缀转换算法的前缀

时间:2010-12-07 07:49:51

标签: algorithm recursion stack prefix infix-notation

alt text


经过一些谷歌搜索,我找到了它!

中缀前缀

该算法是一种非尾递归方法。 反向输入字符串完全被压入堆栈。

prefixToInfix(stack)
   1) IF stack is not empty
     a. Temp -->pop the stack
     b. IF temp is a operator
       i. Write a opening parenthesis to output
       ii. prefixToInfix(stack)
       iii. Write temp to output
       iv. prefixToInfix(stack)
       v. Write a closing parenthesis to output
    c. ELSE IF temp is a space -->prefixToInfix(stack)
    d. ELSE
       i. Write temp to output
       ii. IF stack.top NOT EQUAL to space -->prefixToInfix(stack)

当堆栈顶部

  

F(ABC)

然后我们输入算法,“A”被写入输出,因为它当前是

的值
  

temp = A(比如说)

现在我如何在输出列上得到' - ',因为根据算法,下一个临时值将是“B”,它是在最后一次递归调用后从堆栈中弹出的。  图表如何显示输出“((A-”......

我在做错误的假设? 有人可以解释它吗?

1 个答案:

答案 0 :(得分:1)

我不太明白你的问题。

如果您的筹码为ABCF(ABC)弹出A,则进入分支d.i.并将A写入输出,继续进入d.ii.并执行F(BC),最终将B和C都写入输出。

如果你希望你的输出看起来像在图上那样,你需要你的堆栈为* - A B C(注意每个元素之间的空格!)。

编辑:

(顺便说一下:所有这些都比描述的更容易一步,所以我建议你把算法写成一个程序,并在你选择的调试器中启动它。)

好的,所以你已经将第一个*存储在temp(a)中,写成((bi),然后用剩余的堆栈调用算法(b.ii. )。抛出一个空白,然后将-存储在下一个分支的temp中,写一个(,并用剩余的堆栈调用算法。在某些时候,你最终在d.ii.,你刚刚写了一个A输出,给你

((A

,剩余的堆栈是

_B_C

顶部有空格,B和C之间有另一个空间。
所以现在d.ii.找到空间并且不再做任何事情:这个控制分支完成了,我们回到我们来自的地方,这是d.ii.在-控制分支中。你将-写入d.iii输出,在d.iv.用剩余的堆栈(_B_C)调用算法,然后你去写B)*C以及最后)

只记得你来自哪里,所以你知道在你当前的递归完成后回到哪里。