CS193P,runProgram和Assignment 2

时间:2012-06-01 11:10:58

标签: objective-c

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

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

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

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

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

现在导师已经做了比我更长的时间,因为我认为我错过了一些事情,但我不确定是什么。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

如果你把这看作是将“2,3,4,+,*”传递给“大脑”,你需要考虑堆栈处理器的上下文。

参数按照在数组中遇到它们的顺序进行计算。但是,不要将数组混淆为堆栈,它们是不同的对象。堆栈是计算器例程的内部,输入数组在例程外部。既然我没有在你所在的任何一所学校上学这门课,我就不能说出所用语言的细节,但基本上,把数组想象成“2,3,4,+,*”输入到计算器的键盘。但是,计算器是一台非常简单的机器,一次只能处理一次按键。

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

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

我希望这很清楚。

答案 1 :(得分:0)

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

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

我确实尝试在我的IT词典中查找递归,但它只是说'看到递归'。

答案 2 :(得分:0)

@steve艾夫斯,我想你用这最后的评论把答案钉在了一边。几个星期前(也是我自己)完成了这项任务,我发现这个网站有助于理解反向抛光计算器,它基本上模拟了一个。但是当你在思考递归时,你的大脑可能会进入过载模式。希望这有助于验证您的一些场景测试...祝您好运。 HP12C Emulator