Algorithm 带图的前缀到中缀转换算法

Algorithm 带图的前缀到中缀转换算法,algorithm,recursion,stack,prefix,infix-notation,Algorithm,Recursion,Stack,Prefix,Infix Notation,经过一些谷歌搜索,我找到了它 中缀前缀 该算法是一种非尾部递归算法。 反向输入字符串被完全推入堆栈中 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)


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

中缀前缀

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

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”被写入到输出中,因为它是当前的值

温度=A(比如说)

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

我在哪里做了不正确的假设?
谁能费心解释一下吗?

我不太明白你的问题

如果堆栈是
ABC
F(ABC)
弹出A,进入分支d.i.并将A写入输出,接着进入d.ii.并执行
F(BC)
,最后将B和C写入输出

如果您想让输出看起来像图表上的一样,那么需要将堆栈设置为
*-abc
(注意每个元素之间的空格!)

编辑: (顺便提一下:所有这些都比描述的要简单,所以我建议您将算法作为程序编写,并在选择调试器时启动它。)

好的,您已经将第一个
*
存储在
temp
(a)中,编写了一个
(b.i.),并用剩余的堆栈调用了算法(b.ii.)。这会丢弃一个空白,然后将
-
存储在下一个分支的
temp
,编写一个
),并使用剩余堆栈调用该算法。在某个时刻,您最终进入d.ii.,您刚刚在输出中写入了一个A,给出了

((A
剩下的堆栈是

_B_C
顶部有一个空格,B和C之间有一个空格。
现在,d.ii.找到了空间,不再做任何事情:这个控制分支完成了,我们回到我们的来源,那就是d.ii.在你的
-
控制分支中。你写
-
在d.iii输出,用剩下的堆栈调用算法(
\u B\u C
)在d.iv,你开始写
B
、a
*
C
以及最后一个


记住你从哪里来,这样你就知道在你当前的递归完成后要跳回哪里。

你不会从F(ABC)中得到“-”。@Christian:我刚刚发现这是真的,但即使在输出列上写了“A”之后,我也得到了一个空白,称为分支“c”。然后我得到了“B”它被复制到Temp,然后执行d.ii。被写入输出列…它不反映图片…我仍然不明白。@Tuhin:您需要堆栈上的运算符
*
-
!图片是错误的。从f(a_b_c)它应该返回到f(-a_b_c)而不是f(_a_b_c),然后输出“-”并调用f(_b_c)@Christian:我的堆栈如下Stack[*,-,A,B,C]见分支d.ii。据说“IF Stack.top不等于空格-->prefixToInfix(Stack)”……但我当前在A之后的堆栈顶部是一个空格。因此,控件现在将从分支d.i转到何处(在输出列上写入A之后)@克里斯蒂安:我至少干运行了4次,但发现算法返回的输出是((A B)…并且没有如图所示的所需输出…你是否亲自检查过算法的输出?它是正确的算法吗?我发现它不工作…你说什么?