Objective c CS193P,运行程序和作业2

Objective c CS193P,运行程序和作业2,objective-c,Objective C,我正在完成CS193P的作业2——斯坦福的IOS编程课程。我想知道的一件事是calculatorBrain如何能够接受和运行存储程序,一个程序是一个操作数和操作的数组或堆栈 假设我们要执行以下计算:2,3,4,+* 如果您在calulator中键入此项,将发生以下情况: 2 3 4一次一个被推到堆栈上,然后为每个堆栈运行调用的程序,该程序只需将数字从堆栈中弹出,并返回推到堆栈上的值。 您按下+,runProgram弹出这个,并看到它必须添加前2项,然后将结果推送到堆栈上,现在包含2,7。按*键,

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

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

如果您在calulator中键入此项,将发生以下情况:

2 3 4一次一个被推到堆栈上,然后为每个堆栈运行调用的程序,该程序只需将数字从堆栈中弹出,并返回推到堆栈上的值。
您按下+,runProgram弹出这个,并看到它必须添加前2项,然后将结果推送到堆栈上,现在包含2,7。按*键,堆栈现在包含14个

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

现在,讲师做这件事的时间比我长得多,因为我认为我遗漏了一些东西,但我不确定是什么


有什么想法吗?

如果你认为这是将“2,3,4,+,*”传递给“大脑”,你需要在堆栈处理器的上下文中思考

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

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

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


我希望这是清楚的。

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

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


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

@steve Ives,我想你最后的评论已经给出了答案。几周前(也是我自己)完成了这项任务后,我发现这个网站有助于理解反向波兰计算器,它基本上模拟了一个。但当你思考递归时,你的大脑会进入超负荷模式。希望这有助于验证您的一些场景测试…祝您好运。

您确实意识到,阅读此问题的大多数人并没有参加与您相同的课程。你必须提供更多的上下文信息。@Inerdial-看起来OP正在“参加”斯坦福大学iOS课程。使他的问题有点类似于Project Eulers的问题。@那么这条信息将成为必要的上下文。@Inerdial-OP可以添加一个介绍性的句子,是的。事实上,主要的指示是在cs193p标签的描述中。对不起,伙计们-应该详细说明这与cs193p-斯坦福的IOS编程课程有关,并且实际上只针对其他学习该课程的人,或者对其他人感兴趣,由于context.gaige-我想我知道你的意思:在我看来,runProgram应该真正接受传递的堆栈,从底部开始,弹出内容并将其推到新的堆栈上,并像以前一样执行。这将模拟用户输入操作和操作数。但是讲师很清楚,它不是这样工作的。很可能他所指的功能从未实现过,所以我的困惑是可以理解的。我想我现在就开始吧:-)这要归功于另一个网站上的大卫·巴顿。我一直认为pOOS方法只是获取一个操作数,而忘记了它自己调用它自己。在我的职业生涯中,我从未使用过递归。