1

初めて投稿するので改善方法を教えてください。

私は中置記法を後置記法に変換してから評価するプログラムに取り組んでいます。postfix への変換はうまくいきましたが、評価に問題があります。以下のコードでは、オペランドを倍精度変数「数値」に変換しようとすると、値が維持されません (以下の実行時出力を参照)。問題のメソッドの一部を次に示します (print ステートメントはデバッグ専用です)。

public boolean evaluatePostfix(StringBuffer postfix)
    {
        Stack <Double> operand = new Stack <Double>();//stack to hold operand values
        double answer = 0; //variable to hold result of expression
        boolean error = false; //tests for input error
        int pos = 0; //temp veraible stores position in postfix expression
        double number = 0; //temp variable to convert char to double. also stores that value for reference
        double val1 = 0; //first value for operations
        double val2 = 0; //second value for operations
        double val3 = 0; //answer for val1 and val2

        while (!error && pos < postfix.length())
                {
                    System.out.println(postfix.charAt(pos));
                    if (postfix.charAt(pos) == ' ')
                        ; //do nothing
                    else if (Character.isDigit(postfix.charAt(pos)))
                    {
                        number = Double.parseDouble(postfix.substring(pos));
                        System.out.printf ("number = %f", number);
                        operand.push(number);
                    }
                    else
                    {
                        val1 = operand.pop();
                        val2 = operand.pop();
                        System.out.printf ("val1: %f\tval2: %f\n", val1, val2);

---実行時--- 1

番号 = 49.000000

8

番号 = 56.000000

+

val1: 56.000000

val2: 49.000000

val3 = 105.000000

105.0

4

3 に答える 3

1

'1' => などの各文字の ASCII 値を取得し、49それをスタックにプッシュします。

ほとんどの場合、スキャナーを使用して、入力したテキストから変換された数値を読み取ります。

于 2012-11-12T17:02:33.587 に答える
0

交換:

number = postfix.charAt(pos);

と:

number = Double.parseDouble(Character.toString(postfix.charAt(pos)));

Double.parseDoubleメソッドは、文字列を double に変換します。

Double クラスの valueOf メソッドによって実行されるように、指定された String によって表される値に初期化された新しい double を返します。

(Javadoc より)


String を postfix.toString.split(" ") で分割し、string[] を反復すると、double 値 ("8.4567" など) も解析できます。

    String[] sa = postfix.toString().split(" ");        
    for (String string : sa) {
    .... omissis ...    

それ以外の場合、コードは 1 桁の整数値のみを解析して正しくなります。

于 2012-11-12T17:30:19.523 に答える
0

式の解析は簡単な作業ではない場合があります。より複雑なケースでは、パーサー ジェネレーターを使用することが唯一の妥当なアプローチです。

あなたの場合、それなしで行うことができます:

  • あなたの「トークン」は何ですか?
  • 各トークンの開始と終了をどのように検出しますか?
  • 入力からトークンを抽出したら、それぞれをどうしますか?

トークンは (10 進数) の数値と算術演算子のようです。- それぞれの開始と終了をどのように判断できますか? それらの間の空白 " " は、十分な区切り文字になる場合があります。

次に、トークンを一度に 1 つずつきれいに解析できますDouble.parseDouble(...)。数値トークンを解析し、それに応じて演算子を処理するために使用します。

入力からトークンを抽出する際のサポートについては、Java のTokenizerを参照してください。

于 2012-11-12T18:20:07.050 に答える