2017-03-08 4 views
1

標準のShunting Yard Algorithmには、関数のパラメータの終わりを表す「ウォール」記号が含まれていますか?つまり、任意の数のパラメータを持つ関数を可能にする後置記法(逆ポーランド記法)の変更をサポートすることです。シャントヤードアルゴリズムを変更して壁操作を含める|

修飾ポストフィックス表記法の例をいくつ:(1,2)+9⟶F

| 1 2 f 9 +
f(1,2,3)+9⟶| 1 2 3 f 9 +

どうすればいいのかというアイデアだけでなく、実際の修正を探しています。

  • がトークンを読む:分流ヤードアルゴリズム

    1. 読み取られるトークンがありますが

    2. トークンが数字の場合は、出力キューにプッシュします。
    3. トークンが関数トークンの場合は、トークンをスタックにプッシュします。
    4. トークンは、関数の引数の区切り(例えば、コンマ)の場合:スタックの最上位トークンが左括弧であるまで、出力キューにスタックからポップオペレータ、
      • 。左括弧が見つからない場合、セパレータの配置が間違っているか、かっこが一致していません。
    5. トークンは、オペレータ、O1、場合:そこ演算子トークンO2はオペレータ・スタックの最上部にあるいずれか

      • O1がある間

        • 左結合およびその優先順位がo2のそれ以下であるか、または

        • o1が右結合であり、o2の優先順位よりも低い、

          -pop o2をオペレータスタックから出力キューに移動します。

        • 反復の最後にオペレータスタックにo1をプッシュします。
    6. トークンは左括弧である場合(つまり、 "(")、その後、スタックにプッシュ
    7. トークンが右括弧(すなわちある場合 ")"。):
      • スタックの一番上のトークンが左括弧になるまで、pop演算子はスタックから出力キューに移動します。
      • スタックから左括弧をポップしますが、出力キューにはポップしません。
      • スタックの先頭のトークンが関数トークンの場合は、出力キューにポップします。
      • 左括弧が見つからずにスタックがなくなった場合、括弧が一致しません。
    8. 読むためにトークンがなくなる:
      • オペレータトークンがスタックに残っていますが:
        • スタックの一番上のオペレータのトークンが括弧の場合は、カッコが一致していません。
        • オペレータを出力キューにポップします。
    9. 終了します。
  • +0

    'f'が関数であることをどのように知っていますか?たとえば、入力が '| | a b c d 'd(c(a、b))'または 'd(b(a)、c)'ですか? – rici

    +0

    申し訳ありませんが、fは以前に関数として識別されていたとしてください。さらに、入力中置式には変数がなく、数字だけである。 – bitsmcgee77

    +0

    私は通常、関数、引数、引数の数、そして最後に呼び出しオペレータを出力して関数呼び出しを行います。しかし、 'f'が関数であると言うことができるなら、それはうまくいくと思います。 – rici

    答えて

    0

    溶液は:ステップ4で

    、スタックに機能をプッシュすることに加えて、書き込み|シンボルを出力後置式に置き換えます。

    もちろん、この修正された後置式を評価するアルゴリズムは、壁のシンボルを考慮して変更する必要があります。

    関連する問題