0

CS193P - スタンフォード大学の IOS プログラミング コースの課題 2 に取り組んでいます。私が疑問に思っていたことの 1 つは、calculatorBrain が格納されたプログラム (オペランドと演算の配列またはスタックであるプログラム) をどのように受け入れて実行できるかということです。

では、次の計算を実行したいとしましょう: 2, 3, 4, +, *

これを計算機に入力すると、次のようになります。

2 3 4 は一度に 1 つずつスタックにプッシュされ、それぞれに対して runProgram が呼び出されます。これは単にスタックから数値をポップし、スタックにプッシュされる値を返します。
+ を押すと、runProgram はこれをポップし、上位 2 つの項目を追加する必要があることを確認し、結果をスタックにプッシュします。スタックには現在 2、7 が含まれています。* を押すと、スタックに 14 が含まれるようになります。

しかし、(2, 3, 4, +, ) を含む配列を*脳に渡す方法がわかりません (インストラクターは後で、プログラムを runProgram クラスメソッドに渡すだけで結果を取得できると言っています。つまり、runProgram は最初に一番上のオペランドを実行しよう*とします。つまり、これを実行するために、スタックから次の 2 つのオブジェクトを取得し、それらを乗算して、結果をスタックにプッシュしようとします。これらの 2 つのオブジェクトは「+」と「4」であり、機能しません。

今、インストラクターは私よりもずっと長くこれを行ってきました.私は何かが欠けていると思いますが、何がわからない.

何か案は?

4

3 に答える 3

1

これを「2,3,4,+,*」を「頭脳」に渡すと考えると、スタック プロセッサのコンテキストで考える必要があります。

引数は、配列内で見つかった順序で評価されます。ただし、配列とスタックを混同しないでください。これらは異なるオブジェクトです。スタックは電卓ルーチンの内部にあり、入力の配列はルーチンの外部にあります。私はあなたが通っている学校の特定のクラスを取っているわけではないので、使用されている言語の詳細について話すことはできませんが、基本的に配列 "2,3,4,+,*" は次のように考えてください。電卓のキーボードに入力します。ただし、電卓は非常に単純なマシンであり、一度に 1 つのキー操作しか処理しません。

したがって、配列を処理するときは、基本的に配列の各要素を処理のために計算機に渡し、計算機はスタックにプッシュするか、演算子を実行するかを決定します。これらの要素は順番に渡されるため、計算機は、2、3、4、'+'、'*' を受け取ります。

配列が電卓にスタックとして渡されるという観点から問題を考えようとしているように見えますが、それはここでやりたいことではありません。

これが明確であることを願っています。

于 2012-06-01T11:23:07.663 に答える
0

OK - 答えは、runProgram がスタックから次の項目を取得する方法は、popOperandOffStack (pOOS) メソッドを再帰的に呼び出すことです。

したがって、2 3 4 + * で構成されるプログラムが渡されると、スタックから * をポップすることから始めます。次に、次の 2 つのオペランドをスタックからポップする必要があります。pOOS を呼び出すと、最初に「+」が返されるため、pOOS を再度 (2 回) 呼び出して、それぞれ「4」と「3」を取得し、これらを追加して 7 を取得し、スタックにプッシュ バックします (これには現在含まれています)。 2 7) また、pOOS を呼び出した結果として返されます。そのため、'*' 演算の最初のオペランドに対して pOOS を呼び出したとき、'+' は取得されず、実際には '7' が取得されました。pOOS への 2 番目の呼び出し (* の 2 番目のオペランド) は '2' を取得し、それを乗算して 14 を取得します。

IT 辞書で再帰を調べてみましたが、「再帰を参照」としか表示されませんでした。

于 2012-06-01T23:33:41.897 に答える
0

@steve Ives、この最後のコメントで答えを釘付けにしたと思います。数週間前にこの課題を (これも私自身で) 行ったところ、このサイトがリバース ポリッシュ計算機を理解するのに役立つことがわかりました。これは基本的に 1 つをエミュレートします。しかし、再帰を考えていると、脳が過負荷モードになる可能性があります。これがシナリオ テストの検証に役立つことを願っています...頑張ってください。 HP12Cエミュレータ

于 2012-06-02T20:57:00.060 に答える