经过一些谷歌搜索,我找到了它!
中缀前缀
该算法是一种非尾递归方法。 反向输入字符串完全被压入堆栈。
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-”......
我在做错误的假设? 有人可以解释它吗?
答案 0 :(得分:1)
我不太明白你的问题。
如果您的筹码为ABC
,F(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
以及最后)
。
只记得你来自哪里,所以你知道在你当前的递归完成后回到哪里。