我正在做CS193P -斯坦福IOS编程课程的作业2。我想知道的一件事是,calculatorBrain应该如何能够接受和运行存储的程序,程序是操作数和操作的数组或堆栈。
因此,假设我们要执行以下计算: 2,3,4,+,*
如果您在计算器中键入以下内容,将会发生以下情况:
2、3、4一次一个推送到堆栈上,runProgram为每一个调用,它只是从堆栈中弹出数字并返回推送到堆栈上的值。
你按+,runProgram会弹出这个,看到它必须添加前两个项目,并将结果推送到现在包含2,7的堆栈上。你按*,堆栈现在包含14。
但我不明白如何将包含(2,3,4,+,*)的数组传递给brain (讲师说稍后您可以将程序传递给runProgram类方法并获得结果,而不必实例化brain对象),因为runProgram将首先尝试执行顶部操作数,即*,为此,它将从堆栈中取出下两个对象,并尝试将它们相乘,然后将结果推回堆栈。这两个对象是不起作用的"+“和"4”。
现在,讲师做这件事的时间比我长得多,因为我认为我遗漏了一些东西,但我不确定是什么。
有什么想法吗?
发布于 2012-06-02 07:33:42
OK -答案是runProgram通过递归调用popOperandOffStack (pOOS)方法将下一项从堆栈中取出。
因此,当它被传递到一个包含2、3、4+ *的程序时,它首先从堆栈中弹出*。然后,它必须将下两个操作数从堆栈中弹出。所以它调用pOOS,它首先返回一个'+',所以它再次调用pOOS (两次),分别获得'4‘和'3’,这两个值被添加到get 7上,并被推回到堆栈(现在包含2 7)上,并且也作为调用pOOS的结果返回。因此,当它为'*‘操作的第一个操作数调用pOOS时,它没有得到'+',它实际上得到了'7’。第二次调用pOOS (对于*的第二个操作数)得到'2‘,然后愉快地将其相乘得到14。
我确实试过在我的IT字典中查找递归,但它只显示“请参阅递归”。
发布于 2012-06-01 19:23:08
如果您将此视为将"2,3,4,+,*“传递给”大脑“,则需要在堆栈处理器的上下文中进行思考。
参数按照它们在数组中遇到的顺序进行计算。但是,不要将数组与堆栈混淆,它们是不同的对象。堆栈在计算器例程内部,而输入数组在例程外部。因为我不会在你所在的学校上这门课,所以我不能说出正在使用的语言的细节,但基本上,可以把数组"2,3,4,+,*“看作是计算器键盘的输入。然而,计算器是一台非常简单的机器,一次只处理一个按键。
因此,当您处理数组时,基本上是将数组的每个元素传递给计算器进行处理,然后计算器决定是推送到堆栈还是执行运算符。这些元素是按顺序传递的,因此计算器接收到:2、3、4、'+‘、'*’。
看起来你试图从传递给计算器的数组作为堆栈的角度来思考这个问题,而这不是你想在这里做的。
我希望这一点是清楚的。
发布于 2012-06-03 04:57:00
@steve Ives,我认为你在最后一条评论中找到了答案。几周前(也是我自己)完成了这项任务后,我发现这个网站对理解反向波兰语计算器很有帮助,它基本上是模仿了一个。但是当你在思考递归时,你的大脑可能会进入过载模式。希望这有助于验证你的一些场景testing...Good运气。HP12C Emulator
https://stackoverflow.com/questions/10849162
复制相似问题