如何在不使用堆栈,数组,编程语言或实现的情况下将中缀表达式转换为前缀表达式

时间:2016-05-02 17:15:22

标签: data-structures

有人告诉我在不使用堆栈,数组,任何编程语言或实现的情况下将中缀表达式转换为前缀表达式的任何算法或步骤。非CS学生的简单人工算法。

如果有人有更好的算法或步骤,请指定并尝试解决它,请... :)

(5 + 15/3)^ 2-(8- * 3/3 * 4/5 * 32/5 + 42)*(3 * 3/3 * 5/4)

1 个答案:

答案 0 :(得分:0)

"简单的人类算法"使用堆栈。例如,考虑Shunting Yard。你可以用纸和铅笔做到这一点。 "输出队列"只是您输出的解决方案。 "堆栈"只是一个举办地。所以当它说,"推入堆栈"时,想象一下将该值放在一堆其他值的顶部。当它说,"从堆栈中弹出,"想象一下去除顶部的东西。

使用铅笔和纸张进行操作时,请在页面底部为输出队列指定几行。在页面右侧创建一个列作为堆栈。无论它在哪里,"将其写入输出队列",将该值写为答案行的下一个值。

它第一次说,"推入堆栈",将该值写入堆栈列的底部。如果你必须推送其他内容,请将其写在该值之上。当它说'#34;从堆栈弹出时,"从堆栈列中删除最高值,释放空间。

这是手工做事的最简单可靠的方式。

我将使用您示例的第一位进行演示。我们假设你要将(5+15/3)^2转换为postfix。使用Shunting Yard文章中的说明:

您的输出队列为空,您的堆栈也是如此。第一个标记是(。说明书将其推入堆栈。所以我们有:

output queue:
stack: (

下一个标记是5.它转到输出队列:

output queue: 5
stack: (

接下来是+。由于堆栈顶部没有令牌,我们只需按下它:

output queue: 5
stack: ( +

接下来是15。它转到输出队列

output queue: 5 15
stack: ( +

接下来是/。它是一个运算符,并且堆栈中有一个运算符,但/的优先级高于+。因此,根据规则,我们将/推送到堆栈:

output queue 5 15
stack: ( + /

接下来是3。它进入输出队列:

output queue 5 15 3
stack: ( + /

接下来是)。规则说开始从堆栈中弹出操作符,直到我们到达开括号。或者,如果我们清空堆栈并且没有打开的paren,那么我们的括号不匹配。无论如何,弹出堆栈并添加到输出队列:

output queue: 5 15 3 / +
stack: <empty>

下一个标记为^。堆栈上没有运营商,所以我们推动它。

output queue: 5 15 3 / +
stack: ^

最后,我们有2。它进入输出队列:

output queue: 5 15 3 / + 2
stack: ^

我们在字符串的末尾,所以我们弹出所有运算符并将它们放在输出队列中:

output queue: 5 15 3 / + 2 ^

这是(5 + 15/3)^2的后缀表示。

唯一棘手的部分是让运营商优先。基本上,取幂最高。乘法和除法接下来,在相同的优先级,然后在相同的优先级加法和减法。如果这些是唯一的操作员,那么它很容易记住。否则,您可能需要一个操作符优先级表,以便在您使用算法时可以参考它。一元减号(即5 + -1)需要特殊情况。但实际上,这就是它的全部内容。