Stapel

baker333

Bekanntes Mitglied
Servus,

ich bin dabei, die folgende Übungsaufgabe zu lösen:

Mit den beiden Klassen Stapel und StapelElement soll ein Stapel implementiert werden, der Zeichenketten speichern kann. Dabei soll die Klasse Stapel neben dem Standardkonstuktor die folgenden public-Methoden besitzen:
  • void fuegeElementHinzu(String s) soll s dem Stapel hinzufügen
  • String entferneOberstesElement() entfernt den zuletzt hinzugefügten String und liefert diesen zurück
  • String liefereOberstesElement() liefert den zuletzt hinzugefügten String zurück
  • long liefereGroesse() liefert die Anzahl der gespeicherten Elemente zurück
  • boolean istLeer() liefert true zurück, wenn der Stapel keine Elemente enthält, ansonsten false

Ich habe jetzt beide Klassen implementiert, hänge aber noch bei der Methode "entferneOberstesElement()" fest. Außerdem wundere ich mich warum ich eine so komische Ausgabe bekomme, wenn ich meine Klassen teste. Laut der Online Einsendung gibt auch einige Laufzeitfehler.

Java:
public class Stapel {
    //Attribute
    private StapelElement obersterStapel;
    private long aktuelleHoehe = 0;
    
    //Konstruktor
    public Stapel() {
        this.obersterStapel = null;   
    }
    
    //Methoden
    public void fuegeElementHinzu(String s) {
        StapelElement obersterStapel  = new StapelElement(s);
        this.obersterStapel = obersterStapel;
        aktuelleHoehe++;
    }
    
    
    public int entferneOberstesElement() {
        //ToDo
        
    }

    public String liefereOberstesElement() {
        return obersterStapel.getEntry();
    }
    
    public long liefereGroeße() {
        return aktuelleHoehe;
    }
    
    public boolean istLeer() {
        if(aktuelleHoehe == 0) {
            return true;
        }
        else {
            return false;
        }
        
        
    }
}

Java:
public class StapelElement {
    
    //Attribute
    private String entry;
    private StapelElement next;
    
    
    //Konstruktor
    public StapelElement(String entry) {
        this.entry = entry;
        this.next = null;
    }

    //Methoden
    public String getEntry() {
        return entry;
    }


    public void setEntry(String entry) {
        this.entry = entry;
    }


    public StapelElement getNext() {
        return next;
    }


    public void setNext(StapelElement next) {
        this.next = next;
    }
    
    
    
    
}

Java:
public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Stapel x = new Stapel();
        x.fuegeElementHinzu("1");
        x.fuegeElementHinzu("2");
        
        System.out.print(x);
        //Stapel@15db9742
    }

}


Besten Dank!
 

lennero

Bekanntes Mitglied
Die komische Ausgabe erhältst du, weil du die toString() Methode nicht überschrieben hast. Diese wird nämlich aufgerufen wenn du println dein Objekt übergibst.

Die Klasse ist auch nicht richtig implementiert, weil du immer nur das oberste Element speicherst. Der Ablauf der einfüge-methode sollte folgendermaßen aussehen:

1. Oberstes Element in temporärer Variable speichern
2. Neues Element (mit übergebenem String) erstellen und Referenz oberstesElement dem neuen Element zuweisen. Referenz next von oberstesElement dem temporären Element (dem vorherigen obersten Element) zuweisen.
 

baker333

Bekanntes Mitglied
Danke. Ich habe jetzt mal einiges verändert im Hinblick auf Deinen Vorschlag.

Java:
public class Stapel {
    //Attribute
    private StapelElement obersterStapel = null;
    private long aktuelleHoehe = 0;
    
    //Konstruktor
    public Stapel() {
        this.obersterStapel = null;   
    }
    
    //Methoden
    public void fuegeElementHinzu(String s) {
        //neuer Knoten erstellen
        StapelElement stapel  = new StapelElement(s, obersterStapel);
        obersterStapel = stapel;
        aktuelleHoehe++;
    }
    
    
    public String entferneOberstesElement() {
        String daten = obersterStapel.getEntry();       
        obersterStapel = obersterStapel.getNext();
    aktuelleHoehe--;
    return daten;
        }
    

    public String liefereOberstesElement() {
        if (obersterStapel == null) {
            return null;
        }
        return obersterStapel.getEntry();
    }
    
    public long liefereGroeße() {
        return aktuelleHoehe;
    }
    
    public boolean istLeer() {
        if(aktuelleHoehe == 0) {
            return true;
        }
        else {
            return false;
        }
        
        
    }
}

Code:
public class StapelElement {
    
    //Attribute
    private String entry;
    private StapelElement obersterStapel;
    
    
    //Konstruktor
    public StapelElement(String entry, StapelElement obersterStapel) {
        this.entry = entry;
        this.obersterStapel = obersterStapel;
    }

    //Methoden
    public String getEntry() {
        return entry;
    }


    public void setEntry(String entry) {
        this.entry = entry;
    }


    public StapelElement getNext() {
        return obersterStapel;
    }


    public void setNext(StapelElement obersterStapel) {
        this.obersterStapel = obersterStapel;
    }
    
    
    
    
}

Wieso bekomme ich noch Laufzeitfehler und wie kann ich die toString() Methode ändern?
 

mihe7

Top Contributor
Wieso bekomme ich noch Laufzeitfehler und wie kann ich die toString() Methode ändern?
Welche Laufzeitfehler? Ich gehe mal davon aus, dass Du eine NullPointerException bekommst, weil Du in entferneOberstesElement nicht prüfst, ob der Stapel leer ist.

Die toString-Methode kannst Du einfach überschreiben:
Java:
    @Override
    public String toString() {
        return "Ein schöner String";
    }
 

mihe7

Top Contributor
Naja, wenn Du
Java:
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Stapel x = new Stapel();
        x.fuegeElementHinzu("1");
        x.fuegeElementHinzu("2");
        
        System.out.print(x);
        //Stapel@15db9742
    }
schreibst, dann wird x.toString() aufgerufen. Folglich musst Du die toString()-Methode von Stapel überschreiben.

Jetzt könntest Du Dir überlegen, dass Du in dieser Methode gerne die toString()-Methode der Elemente verwenden willst. Dann müsstest Du auch die toString()-Methode von StapelElement überschreiben.
 

Ähnliche Java Themen

Neue Themen


Oben