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)…并且没有如图所示的所需输出…你是否亲自检查过算法的输出?它是正确的算法吗?我发现它不工作…你说什么?