Hallo zusammen. Ich soll einen Stack (Stapel) mit den Methoden push und pop implementieren.
Die Elemente des Stapels sind Objekte vom Typ Node:
static class Node
{
int data;
Node next;
}
Die Instanzvariable top der Klasse Stack ist vom Typ Node und zeigt auf
das oberste Element im Stapel. Um die Klasse zu testen, soll ich einen
Stapel mit den Werten 1 bis 30 mittels einer Schleife erzeugen und den dann ausgeben.
Java:
publicclassStack{//Attribut, oberstes ElementNode top;Stack(){}publicvoidpush(){for(int i =1; i <=30;++i){Node n =newNode();
top = n;
n.data = i;
n.next = n;}}publicvoidpop(){}publicstaticvoidmain(String[] args){Stack s1 =newStack();
s1.push();}staticclassNode{Node(){}//AttributeNode next;int data;}}
Die innere Klasse habe ich implementiert, doch weiß nicht wie ich weiter vorgehen soll..Wie kriege ich es hin, den Stapel zu bilden?
Ne bestimmt nicht.. Habe da einfach bisschen rumgespielt...Wie gehe ich die Aufgabe an?
Zuerst wird ja eine neue Instanz n erzeugt.
Dann sage ich, dass das neu erzeugt Element n, top ist.
Als nächstes muss ich den Inhalt von n mit dem Wert i befüllen.
Und wie sage ich jetzt, dass das nächste Element, dass Element des nächsten Schleifendurchgangs sein soll?
Also auch vom Verständnis her: Du sollst einen Stack implementieren und dann den Stack testen. Daher ist so eine Methode:
Java:
publicvoidpush(){for(int i =1; i <=30;++i){Node n =newNode();
top = n;
n.data = i;
n.next = n;}}
auch vom generellen Ansatz her falsch.
push bekommt ein Element das dann eingefügt wird. Und das testest Du dann in einem Testprogramm mit 30 Werten, die in einer Schleife eingefügt werden ...
Und ich rate Dir auch, Dir das einmal aufzuzeichnen um dann zu schauen, was Du wie umsetzen musst... Die Reihenfolge ist halt mit entscheidend sonst überschreibst Du Dir eine Referenz, die Du später noch brauchst ...
publicvoidpush(){for(int i =1; i <=30;++i){Node n =newNode();//Element erzeugen
top = n;
n.data = i;//Element erhält data i
n.next = top;System.out.print(n +"+"+"");}}
Das hier wäre meine Optimierung...Wie gebe ich das Objekt als String aus?
Leider immer noch nicht besser. Geh es doch mal schreit für schritt durch.
Du erzeugst eine Node.
Dann setzt du top auf diese Node
dann weißt du der neuen Node Daten zu
und dann setzt du den next von der neuen node auf top. Was ist denn top in dem Moment? Siehe Zeile 2 -> top ist die neue Node. Somit zeigt next von der neuen node auf sich selber und du hast eine endlosliste mit einem element...
und dann setzt du den next von der neuen node auf top. Was ist denn top in dem Moment? Siehe Zeile 2 -> top ist die neue Node. Somit zeigt next von der neuen node auf sich selber und du hast eine endlosliste mit einem element...
Hast Du es Dir denn einmal aufgezeichnet? Wenn man es sich grafisch aufmalt, dann ist das deutlich einfacher zu verstehen!
Und generell kannst Du davon ausgehen, dass ich mir schon etwas bei meinen Worten gedacht habe. Das "Die Reihenfolge ist halt mit entscheidend sonst überschreibst Du Dir eine Referenz, die Du später noch brauchst ..." habe ich nicht ohne Grund geschrieben.
Ich bin mir sicher, dass du dir etwas dabei denkst, doch für euch ist es natürlich alles eingängiger. Ihr seht auf den ersten Blick sofort um was es geht.
Ja ich habe es mir aufgezeichnet und meine Idee wäre, den Verweis auf next vorher zu setzen.. also
for (int i = 1; i <= 5; ++i)
{
Node n = new Node(); //Element erzeugen
n.data = i; //Element erhält data i
n.next = top;
top = n;
}
Ich würde das neu erlangte Wissen gerne in die nächste Aufgabe überführen wo es auch um Listen geht. In der Methode setData() soll ein Element überschrieben werden. Ich habe mal bisschen rumprobiert.
Der Ansatz ist doch soweit richtig, oder?
Ich muss ja einmal ein neues Element e erstellen und dass muss sich ja quasi durch die Liste bewegen können. Auch hier hatte ich die Schwierigkeit, zu verstehen, was das nächste Element von e ist.
Muss ich in diesem Fall nicht aber zwingend sagen, dass e mein top ist?
Java:
publicclassMyList{Element top;Element last;publicMyList(){this.top =null;this.last =null;}publicvoidadd(String x){Element e =newElement(x);if(top ==null){
top = e;
last = e;}else{
last.next=e;
last = e;}}publicvoidinsertTop(String x){Element e =newElement(x);if(top ==null){
top = e;
last = e;}else{
e.next = top;
top = e;}/*
* Hier soll ein neues Element am Kopf
* der Liste eingefügt werden. Dabei berücksichtigen,
* dass der Kopf (top) auf das neue Element und das
* neue Element auf den alten Kopf zeigen muss.
*/}publicvoidappendList(MyList l2){
last.next = l2.top;//Letztes Element der alten Liste mit ersten Element der neuen Liste verbinden
last = l2.last;//Verbindung zum letzten Element der neuen Liste machen/*
* Hier wird eine zweite Liste übergeben wobei
* das letzte Element der aktuellen Liste
* auf den Kopf der übergebenen Liste zeigt, und
* sich das letzte Element (last) ebenfalls ändert.
*/}publicvoidsetData(String x,int index){Element e =newElement(x);//Neues Element erzeugenfor(int i =0; i <=4;++i)//Hochzählen{
top = e;if(i == index){
e.data = x;return;}
e.next = top;}return;/*
* Das Element an der Stelle index (beginnend
* mit 0 für das erste Element) soll ein neues
* Datum erhalten.
* Falls das Ende der Liste vorzeitig erreicht wurde,
* wird die Ausführung mit einem return unterbrochen.
*/}publicStringtoString(){if(top ==null)return"";String erg ="";Element cur = top;while(cur !=null){
erg += cur.toString();
cur = cur.next;}return erg;}publicstaticvoidmain(String[] args){MyList l =newMyList();
l.add("b");
l.add("c");
l.add("d");
l.add("e");System.out.println(l);//Gibt "bcd" zurück
l.insertTop("a");System.out.println(l);// Gibt "abcd" zurückMyList newlist =newMyList();
newlist.add("1");
newlist.add("2");
newlist.add("3");
newlist.add("4");
l.appendList(newlist);System.out.println(l);// Gibt "abcd123" zurück
l.setData("x",1);System.out.println(l);// Gibt "axcd123" zurück
l.setData("x",2);System.out.println(l);// Gibt "axxd123" zurück}}classElement{Element next;String data=null;publicElement(String x){this.data=x;}publicStringtoString(){return(data!=null)? data :"";}}