シャントヤードアルゴリズムの出力をどうするかを理解するのに苦労する

StackOverflow https://stackoverflow.com/questions/8344460

質問

私は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 ^ ^ / + 次のように左から右へ:

  1. 数字を保持するためにスタックを初期化します。
  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'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top