drzewo wyrażenia arytmetycznego

0

Mam do zrobienia takie oto zadanie:

Wyrażenia arytmetyczne można reprezentować jako drzewa, gdzie w liściach pamiętane są liczby, a w węzłach symbole operacji arytmetycznych. Zaimplementuj w Javie odpowiednie klasy reprezentujące węzły i liście takiego drzewa jako podklasy klasy Wyrażenie.
W każdej klasie zdefiniuj metodę
public int oblicz();
obliczającą wartość wyrażenia reprezentowanego przez obiekt. Zdefiniuj odpowiednie konstruktory. Przyjmij, że w liściach mogą być zarówno stałe liczbowe jak i zmienne. Przyjmij,
że wartości zmiennych są przechowywane np. tablicy haszującej (możesz wykorzystać tu klasy
biblioteczne).

I teraz moje pytanie brzmi: Jak powinny wyglądać klasy Lisc, Wezel oraz Wyrazenie?
Coś takiego?

class Wyrazenie
{
     Object value;
     Wyrazenie prawe; 
     Wyrazenie lewe;   
}

Jak teraz mają wyglądać 2 pozostałe klasy?

1

Tak bym to mniej więcej zrobił:

public interface Wyrazenie {
    public int oblicz();
}

public interface Operator {
    public int oblicz(int x, int y);
}

public class Dzialanie implements Wyrazenie {
    private Wyrazenie lewe;
    private Wyrazenie prawe;
    private Operator operator;

    public Dzialanie(Wyrazenie lewe, Operator operator, Wyrazenie prawe) {
        this.lewe = lewe;
        this.prawe = prawe;
        this.operator = operator;
    }

    public int oblicz() {
        return operator.oblicz(lewe.oblicz(), prawe.oblicz());
    }
}
public class Stala implements Wyrazenie {
    private int wartosc;

    public Stala(int wartosc) {
        this.wartosc = wartosc;
    }

    public int oblicz() {
        return wartosc;
    }
}
public class Zmienna implements Wyrazenie {
    private String nazwa;
    private Map<String, Integer> kontekst;

    public Zmienna(String nazwa, Map<String, Integer> kontekst) {
        this.nazwa = nazwa;
        this.kontekst = kontekst;
    }

    public int oblicz() {
        return kontekst.get(nazwa);
    }
}

Użycie:

Map<String, Integer> kontekst = new HashMap<>();
kontekst.put("y", 10);

Wyrazenie x = new Stala(20);
Wyrazenie y = new Zmienna("y", kontekst);

Operator plus = new Operator() {
    int oblicz(int x, int y) {
        return x + y;
    }
}

Wyrazenie xplusy = new Dzialanie(x, plus, y);
println(xplusy.oblicz()); // 30
0

Mam pytanie, czy operatory nie powinny zostać zdefiniowane wcześniej w kodzie programu jako klasy dziedziczące po klasie Operator?

Jeśli chodzi o HashMap to działa ona w taki sposób, że jako klucze przechowuje stringi i obok każdego takiego klucza znajduje się odpowiadająca mu wartość typu int? Czy taki klucz jest unikatowy, tzn. czy mogę mieś w tej HashMa'ie wartości powiedzmy ("y",10) i ("y", 1) ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1