0

Shunting Yard アルゴリズムの Java コードを記述する必要があります。文字列を受け取り、それをキューに入れ、評価を開始します。問題なく動作するはずの Node、Stack、Queue のクラスを取得しました。私のメソッドバランサーはこれです...

public boolean balancear (Cola infijo) {

    balance=infijo;
    int balanceado=0;
    char parentesis;

    while (!balance.isEmpty()) {

        parentesis=balance.pop();
        if (parentesis=='(')
            balanceado++;
        else if (parentesis==')')
            balanceado--;
    }

    return balanceado==0;
}



package expresionpolaca;
public class Postfijo {

    Pila operadores = new Pila();
    Cola infijo = new Cola ();
    Cola postfijo = new Cola ();
    Herramientas evaluador;
    StringBuilder salida = new StringBuilder();
    int re;

    public Postfijo (String expresion) {

        for (int i = 0; i < expresion.length() ; i++) {
            infijo.push(expresion.charAt(i));

        }

    }

    public String Convertir () {


        evaluador.balancear(infijo);         // I get NullPointerException Right HERE

        if (evaluador.balancear(infijo)) {   // I get NullPointerException Right HERE

            while (!infijo.isEmpty()) {


                char tmp=infijo.pop();
            if (Character.isLetterOrDigit(tmp)) { 
                postfijo.push(tmp);
            }

            else  {
                switch (tmp) {

                case '(':
                    operadores.push(tmp);
                    break;
                case ')':

                    do {
                        tmp=operadores.pop();
                        if (tmp!='(') postfijo.push(tmp);
                    } while(tmp!='(');
                    operadores.pop();
                    break;

                default:
                    if (operadores.sneak()=='(') operadores.push(tmp);
                    else while (evaluador.prioridad(tmp)>evaluador.prioridad(operadores.sneak())||operadores.sneak()!='('||operadores.isEmpty()==false) {
                        postfijo.push(operadores.pop());
                    }
                    break;
                }

            }

        }

        while (!operadores.isEmpty()) postfijo.push(operadores.pop());

    }

    else return "No balanceada";

    while (!postfijo.isEmpty()) {

        salida.append(postfijo.pop());
    }

    return salida.toString();



}

}

4

2 に答える 2

2

を初期化することはevaluadorなく、宣言するだけです。適切な値に初期化してから使用してください。

于 2012-09-22T17:28:54.180 に答える
1

メソッドで初期化していないグローバル変数の場合evaluadorは、使用する前にどこかで初期化されていることを確認してください

于 2012-09-22T17:29:59.687 に答える