распечатать дерево выражений OO в java

Я работаю над назначением дерева выражений объектно-ориентированного Java, где мне нужно иметь возможность оценивать и печатать деревья выражений в форматах префикса/инфикса/постфикса. Назначение описывает иерархию классов со статическим типом "Exp" и несколькими унарными и бинарными подклассами.

Я решил часть eval, заставив унарный и двоичный классы реализовать метод eval() (как продиктовано корневым типом «Exp»), но мне нужна помощь с печатью выражения. Я работал с этим в течение нескольких дней и ничего не получил. Вся помощь, которую я нашел в Интернете, касается бинарных классов, которые имеют поля операторов и значений (в моем задании это два разных класса). Пинок в нужном направлении, буду очень признателен :-)

С наилучшими пожеланиями, Расмус

public interface Exp { double value(); }
public class Value implements Exp {
    private double value;    
    public Value(double val)    { this.value = val; }    
    public double value()       { return this.value; }
}
public class Binary implements Exp {
    private char op; private Exp right; private Exp left;

    public Binary(char op, Exp left, Exp right) { 
        this.op = op; this.left = left; this.right = right; 
    }
}
    public double value() { // sum up using recursion
        switch(this.op) {
            case '+':   return this.left.value()+this.right.value();
            case '-':   return this.left.value()-this.right.value();
            case '*':   return this.left.value()*this.right.value();
            case '/':   return this.left.value()/this.right.value();
            default:    return Double.NaN;
        }
    }   
}
public class Main { //calculating total ok - needs printing!
    public static void Main(String[] args) {
        Exp valLeft = new Value(10);
        Exp valRight = new Value(5);
        Exp bN1 = new Binary('+', valLeft, valRight);
        Exp bN2 = new Binary('+', bN1, new Value(3));
        System.out.println(bN2.value());
    }
}

person Rasmus    schedule 19.04.2011    source источник


Ответы (2)


Вот как сделать инфикс. Префикс и постфикс должны быть доступны для вас, как только вы увидите, как это делается.

В интерфейсе Exp добавьте:

String asInfix();

В классе Binary добавьте:

public final String asInfix() {
  return "(" + left.asInfix() + " " + op + " " + right.asInfix() + ")";
}

В классе Value добавьте:

public final String asInfix() {
  return "" + value;
}

Теперь вы можете сделать System.out.println(bN2.asInfix());, чтобы отобразить ((10.0 + 5.0) + 3.0).

person Olathe    schedule 19.04.2011
comment
Фантастика(!) :-) могу я спросить, почему вы объявляете метод final? - person Rasmus; 20.04.2011
comment
Это просто привычка, так как я обычно не создаю подклассы. Не стесняйтесь опустить это. - person Olathe; 20.04.2011

Подойдите к нему таким же образом. Переопределите toString, чтобы он вызывал его рекурсивно для left и right в случае Binary и возвращал значение для Value узлов.

person Xion    schedule 19.04.2011
comment
Уважаемый Xion, я расширил свой статический тип методом печати и реализовал его вместе с переопределенным toString. При печати выражения, которое я создаю в тесте, рекурсия идет только на один уровень? - person Rasmus; 20.04.2011