-2

私は離散数学の課題の1つで真理値表ジェネレーターに取り組んでいます。操車場アルゴリズムを実装する必要があり、そうすることは完全に失われています。私の問題は、操車場アルゴリズムを実装することです。最初に、私が調べたリソース、次に問題、次に開始したコードを示します。

私が本当に必要としているもの..私はそれがたくさんを求めていることを知っています。しかし、これは操車場アルゴリズムのダムダウンバージョンです。o1 o2などの表記法を使用すると、ウィキペディアの例の一部で迷子になります。私が本当に必要としているのは、これを適用する方法を段階的に説明する人です。RPN表記がどのように機能するのかもわかりません。しかし、それについては今すぐ読むことができます。

入力例は次のとおりです
。A->B
(C)
:。F


ABCA-> BF
TTT--T --- T
TFT--F --- F
FTT--T --- T
FFT--T ---
FTTF--を示す入力を生成することになっています。T --- F
TFF--F --- F
FTF--T --- F
FFF--T --- F

import java.util.Stack;
import java.util.ArrayList;

public class ShuttingYard{

private static final char THEREFORE = '>';
private static final char AND       = '&';
private static final char OR        = '|';


public static String inputToReversePolishNotation(String input)
{

    char[] tokens = input.toCharArray();
    ArrayList<String> output = new ArrayList<String>();
    Stack<String> oppStack = new Stack<String>();

    for(int i = 0; i < tokens.length; i++)
    {

    }

    return null;

}

public static boolean isLogicOperator(char input)
{

    switch(input)
    {
        case THEREFORE:
            return true;
        case AND:
            return true;
        case OR:
            return true;
        default:
            return false;
    }

}

}
4

1 に答える 1

3

あなたがあなたに問題を与えるとあなたが言及する特定のビットはこれであると私は信じます:

  • トークンが演算子o1の場合、次のようになります。
    • スタックの一番上に演算子トークンo2があり、
      • o1が左結合であり、その優先順位がo2の優先順位以下であるか、または
      • o1の優先順位はo2の優先順位よりも低くなります。
    • スタックからo2を出力キューにポップします。
  • o1をスタックにプッシュします。

この作品で混乱するのは理解できると思います。優先順位規則は、解析を容易にするためにRPNが非常に好まれる理由です。それを読むときは、「o1」は読み込んでいる演算子であり、「o2」はスタックの最上位にある演算子であることを覚えておいてください。

これを処理するには、演算子に優先順位の値を割り当てる必要があります。算術について話し合っている場合、たとえば、優先順位の値に+= 1、*= 2、および^=3を割り当てることができます。読み取っている演算子に、スタックの最上位にある演算子と同じかそれ以下の優先順位が割り当てられている場合は、その演算子をスタックからポップして出力に渡します。スタック上で読み取り演算子よりも優先順位の低い演算子が見つかるまで、またはスタックの(新しい)最上位にある演算子が見つからなくなるまで、これを実行します。とにかく、次に読み取り演算子をスタックにプッシュします。

全体のステップバイステップに関する限り、ウィキペディアの記事はかなり良いです。定義された各ルールがあなたのケースに適用されない場合があることに注意してください。定義したトークンから判断すると、関数や括弧について心配する必要はないように見えるので、そこでのアルゴリズムは次のように簡略化できます。

  • 読み取るトークンがありますが:
    • トークンを読み取ります。
    • トークンが数値の場合は、それを出力キューに追加します。
    • トークンが演算子o1の場合、次のようになります。
      • スタックの最上位に演算子トークンo2があり、o1が左結合であり、その優先順位がo2の優先順位以下であるか、o1の優先順位がo2の優先順位よりも低い場合、
        • スタックからo2を出力キューにポップします。
      • o1をスタックにプッシュします。
  • 読み取るトークンがなくなった場合:
    • スタックにはまだオペレータートークンがありますが、
      • 演算子を出力キューにポップします。
  • 出口。

かっこや関数が必要な場合でも、より単純な問題から始めて、問題が解決したらそれを強化すると役立つ場合があります。

于 2013-01-25T23:08:51.633 に答える