Hi, hab ein Verständnis Problem mit (Stacks) bzw. folgender Aufgabe. s.u.! Hab auch schon hier im Forum geschaut, allerdings bin ich nicht wirklich weiter gekommen, hat einer zufällig ein gutes Bsp. für einen Stack. Finde bei google nur die Funktionen/Methoden, aber nicht wie man sie einsetzt bzw. immer nur kurze Beispiele dir mir nicht wirklich weiterhelfen.
Aufgabe:
Verwenden Sie hierzu den folgenden Klassenrumpf. Dabei ist zu beachten, dass der Stack eine beliebige Anzahl von Objekten speichern können muss.
Code:
public class Stack {
Data last; //oberstes Element
class Data{
Data prev; //vorheriges Element
Object object; //Daten
}
public Stack(){
//Implementieren Sie diese Methode
}
void push(Object o){
//Implementieren Sie diese Methode
}
Object pop(){
//Implementieren Sie diese Methode
}
Object top(){
//Implementieren Sie diese Methode
}
}
Hab bis jetzt folgendes gemacht, aber bin mir nicht sicher ob der Weg überhaupt stimmt!
Code:
import java.util.*;
public class Stack {
Data last; //oberstes Element
class Data{
Data prev; //vorheriges Element
Object object; //Daten
}
public Stack(){
//Implementieren Sie diese Methode
}
void push(Object o){
//Implementieren Sie diese Methode
s.push(o);
}
Object pop(){
//Implementieren Sie diese Methode
return last;
}
Object top(){
//Implementieren Sie diese Methode
return last;
}
public static void main(String[] args) {
Stack s = new Stack(); //Ist das hier an der richtigen Stelle???
}
}
Hey, also ich hab jetzt hier mal was gebastelt, so wie ich einen Stack machen wuerde:
Code:
public class Stack
{
Data last; //oberstes Element
public Stack()
{
}
/**
* Legt ein neues Element auf den Stack
* @param o Die Daten des neuen Elements
*/
public void push(Object o)
{
last = new Data(last,o);
//System.out.println("push: "+last);
}
/**
* Gibt das oberste Element des Stacks zurueck und loescht es vom Stack
* @return Das oberste Element des Stacks
*/
public Object pop()
{
Data d = last;
last = last.getPrev();
//System.out.println("pop: "+d);
return d;
}
/**
* Diese Funktion gibt das oberste Element zurueck, lasst den Stack aber
* sonst unveraendert!
*
* @return Das oberste Element des Stacks
*/
public Object top()
{
//System.out.println("top: "+last.toString());
return last;
}
}
class Data
{
private Data prev; //vorheriges Element
private Object daten; //Daten
/**
* Erzeugt ein neues Data Objekt
* @param prev Das vorgaenger Element des neu zu erzeugenden Elements
* @param daten Die Daten
*/
public Data(Data prev, Object daten)
{
this.prev = prev;
this.daten = daten;
}
public Data getPrev()
{
return prev;
}
public Object getDaten()
{
return daten;
}
}
Zum testen kannst du ja dann die Ausgaben auskommentieren und sowas hier ausfuehren:
Code:
public class Test
{
public static void main(String[] args)
{
Stack s = new Stack();
s.push(new Object());
s.push(new Object());
s.top();
s.pop();
s.top();
}
}
Hab doch noch eine Frage, s.u. wird ja das Element gelöscht, also mit last = last.getPrev(); Ist das dann wirklich gelöscht, weil eigentlich sezte ich doch nur, na ja wie soll ich sagen den Verweis oder Zeiger um, d.h. auf das vorherige Element. Oder sehe ich das Falsch?
Zeile: 27
Code:
public Object pop()
{
Data d = last;
last = last.getPrev();
System.out.println("pop: "+d);
return d;
}
Das ist schon richtig. Da aber danach gar keine Variable auf das Element
mehr verweist, ist es nur noch eine Frage der Zeit, wann sich der
Garbage Collector dieses nun verwaisten Objekts annimmt.
Außerdem ist es aus Sicht der Liste nicht mehr vorhanden (es kann nicht
mehr erreicht werden) und dadurch gelöscht.