algorithm - 前缀到中缀转换算法附图

标签 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 (say)

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

我在哪里做了不正确的假设? 有人可以麻烦解释一下吗?

最佳答案

我不太明白你的问题。

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

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

编辑:

(顺便说一句:所有这些都比描述的更容易逐步完成,所以我建议您将算法编写为程序并在您选择的调试器中启动它。)

OK,这样你就把第一个*存入了temp(a),写了一个((b.i.),调用了算法与剩余的堆栈(b.ii.)。这会抛出一个空白,然后您将 - 存储在下一个分支的 temp 中,写一个 (, 并用剩余的堆栈调用算法。在某个时候,你最终进入 d.ii.,你刚刚写了一个 A 输出,给你

((A

剩下的栈是

_B_C

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

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

关于algorithm - 前缀到中缀转换算法附图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4374388/

相关文章:

c++ - 扩展 std::unordered_set<> 以与 std::stack<> 一起使用

algorithm - 提高函数的运行时间意味着什么?

c++ - [L,R] 中具有奇数个奇因数的数字的个数

algorithm - Haskell 中 sortBy 的复杂性

python - 保持 OrderedDict 的顺序

c - 内联汇编堆栈行为

algorithm - 并行处理的计算顺序

c# - 带返回值的递归函数VS使用OUT参数

c++ - 递归斐波那契

c# - 恢复 C# 异步方法时,System.Diagnostics.StackTrace 中缺少 Visual Studio 2017 调用堆栈中可见的堆栈帧