0

我正在做 CS193P 的作业 2 - 斯坦福的 IOS 编程课程。我想知道的一件事是calculatorBrain 应该如何接受和运行一个存储的程序,一个程序是一个数组或操作数和操作的堆栈。

假设我们要执行以下计算:2、3、4、+、*

如果您将其输入计算器,则会发生以下情况:

2 3 4 一次一个地被压入堆栈,并为每个调用 runProgram ,它只是将数字从堆栈中弹出并返回它的值,该值被压入堆栈。
你按下 +,runProgram 弹出这个并看到它必须添加它所做的前 2 个项目,并将结果推送到现在包含 2、7 的堆栈上。你按下 *,堆栈现在包含 14。

但是我看不到如何将包含 (2, 3, 4, +, *) 的数组传递给大脑(讲师稍后说您可以将程序传递给 runProgram 类方法并获得结果,而不必实例化一个大脑对象),因为 runProgram 将首先尝试执行顶部操作数 ie*并为此将接下来的两个对象从堆栈中取出并尝试将它们相乘并将结果推回堆栈。这两个对象是“+”和“4”,它们不起作用。

现在教练做这件事的时间比我长得多,因为我认为我错过了一些东西,但我不确定是什么。

有任何想法吗?

4

3 回答 3

1

如果您将此视为将“2,3,4,+,*”传递给“大脑”,则需要在堆栈处理器的上下文中进行思考。

参数按照它们在数组中出现的顺序进行评估。但是,不要混淆堆栈的数组,它们是不同的对象。堆栈在计算器例程内部,输入数组在例程外部。由于我没有在您所在的任何学校上特定的课程,因此我无法谈论所使用语言的细节,但基本上,将数组 "2,3,4,+,*" 视为输入到计算器的键盘。然而,计算器是一个非常简单的机器,一次只处理一个按键。

因此,当您处理数组时,您基本上是将数组的每个元素传递给计算器进行处理,然后计算器决定是推入堆栈还是执行运算符。这些元素按顺序传递,因此计算器接收:2 后跟 3,然后是 4,然后是 '+',然后是 '*'。

看起来您正在尝试将数组作为堆栈传递给计算器来考虑问题,而这不是您想要在这里做的。

我希望这很清楚。

于 2012-06-01T11:23:07.663 回答
0

好的 - 答案是 runProgram 从堆栈中获取下一项的方式是递归调用 popOperandOffStack (pOOS) 方法。

因此,当它通过一个由 2 3 4 + * 组成的程序时,它首先将 * 从堆栈中弹出。然后它必须将接下来的两个操作数从堆栈中弹出。所以它调用 pOOS,它首先返回一个“+”,然后它再次调用 pOOS(两次),分别得到“4”和“3”,它们被添加到 7,它被推回堆栈(现在包含2 7) 并且也作为调用 pOOS 的结果返回。因此,当它为“*”操作的第一个操作数调用 pOOS 时,它没有得到“+”,它实际上得到了“7”。第二次调用 pOOS(对于 * 的第二个操作数)得到 '2',然后它很高兴地乘以得到 14。

我确实尝试在我的 IT 字典中查找递归,但它只是说“查看递归”。

于 2012-06-01T23:33:41.897 回答
0

@steve Ives,我认为您在最后一条评论中找到了答案。几周前完成了这项任务(也是我自己完成的),我发现这个网站有助于理解逆波兰计算器,它基本上模仿了一个。但是当你在思考递归时,你的大脑可能会进入过载模式。希望这有助于验证您的一些场景测试......祝你好运。 HP12C 模拟器

于 2012-06-02T20:57:00.060 回答