シャントヤードアルゴリズムの出力をどうするかを理解するのに苦労する
-
27-10-2019 - |
質問
私はwikiページを見てきました: http://en.wikipedia.org/wiki/shuntting-yard_algorithm
コードの例を使用して最初の部分を構築しましたが、基本的には現在ターンできます。
3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3
の中へ 3 4 2 * 1 5 − 2 3 ^ ^ / +
しかし、私はその後どのように使用するかわかりません 3 4 2 * 1 5 − 2 3 ^ ^ / +
取得する 3.00012207
そして、Wikiに関する例のコードと説明は私には意味がありません。
誰かが評価方法を説明してください 3 4 2 * 1 5 − 2 3 ^ ^ / +
答えを生み出します。前もって感謝します。コードの例は、良い説明や例の内訳だけを必要としません。
それが重要ではありませんが、私は.NET C#を動かしています。
解決
シャントヤードアルゴリズムの目的は、その出力が 逆ポーランド表記, 、評価するのは簡単です。
- 値を保持するスタックを作成します
- 逆ポリッシュ表記が残っていますが、残り:
- 入力のアイテムを読んでください
- 値の場合は、スタックに押し込みます
- そうでなければ、それは操作です。スタックからのポップ値、それらの値の操作を実行し、結果を再発します
- 入力が残っていない場合、式が十分に形成されている場合、スタックに正確に1つの値があるはずです。これは評価された結果です。
他のヒント
ポストフィックス表記は、たとえばHP計算機で数学をどのように行うかです。
番号を取得するたびに、スタックを保管してください。オペレーターが上部から入力を消費してから、結果を上部に追加するたびに
token stack
*empty*
3 3 //push numbers...
4 3 4
2 3 4 2
* 3 8 //remove 4 and 2, add 4*2=8
1 3 8 1
5 3 8 1 5
- 3 8 -4
2 3 8 -4 2
3 3 8 -4 2 3
^ 3 8 -4 8
... ...
要素を処理します 3 4 2 * 1 5 − 2 3 ^ ^ / +
次のように左から右へ:
- 数字を保持するためにスタックを初期化します。
- 要素が数字の場合は、スタックに押し込みます。
- 要素が演算子の場合、スタックから上部2つの要素を削除し、演算子をこれらの2つの要素に適用し、結果をスタックに押します。
最後に到達すると、スタックには結果となる単一の要素が必要です。
私はパーティーに少し遅れているようです。
私は質問を見て、ロゼッタ・コードのいくつかのタスクを書いているという接線に出ました。それはちょうどそれが起こる この仕事 あなたが望んでいるかもしれません。 RPN式の値を計算したときにトークンによるトークンによる何が起こるかについての注釈付きテーブルを与えます。
これがその出力のサンプルです。
For RPN expression: '3 4 2 * 1 5 - 2 3 ^ ^ / +'
TOKEN ACTION STACK
3 Push num onto top of stack 3
4 Push num onto top of stack 3 4
2 Push num onto top of stack 3 4 2
* Apply op to top of stack 3 8
1 Push num onto top of stack 3 8 1
5 Push num onto top of stack 3 8 1 5
- Apply op to top of stack 3 8 -4
2 Push num onto top of stack 3 8 -4 2
3 Push num onto top of stack 3 8 -4 2 3
^ Apply op to top of stack 3 8 -4 8
^ Apply op to top of stack 3 8 65536
/ Apply op to top of stack 3 0.0001220703125
+ Apply op to top of stack 3.0001220703125
The final output value is: '3.0001220703125'