[Java] Anfängerhilfe Stack

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von MuuuHnnSteRRR, 4. November 2010 .

Schlagworte:
  1. 4. November 2010
    Anfängerhilfe Stack

    Hallo zusammen,
    im Infountterricht sollten wir einen Stack selbst programmieren, danach einen dynamischen Stack (also erst mit Array dann mit Referenz). Nun habe ich das ganze ein wenig erweitert und habe folgendes Problem:
    Ich will eine Reihe von Zahlen aus einer Textdatei auslesen, diese Zahlen werden dann von String in Integers umgewandelt und an das Applet was das ganze ausgibt übergeben. Das klappt soweit, die Daten kommen im Applet an und werden dort in einem Array gespeichert. Allerdings werden die Daten dann nicht in den Stack gepackt, obwohl ich die Methoden dazu (meines erachtens) korrekt ausführe. Habe auch schon beides versucht, die Push-Methode des Applets sowie direkt über die Push-Methode des Stacks


    Code:
     public void readIt()
     {
     theReader reader = new theReader(); //Readerklasse
     tempList = reader.getList(); // Methode der Readerklasse die den Array gibt
     
     for(int i=0; i<tempList.length; i++)
     {
     n++; //Variable aus dem Applet um zu sehen wie lang der Stack nun ist
     add(tempList[i]); //Methode des Applets die den Integer Parameter an den //Stack weitergibt
     Stack.push(tempList[i]); //Direkte Pushmethode des Stacks, nur eins von //beiden jeweils ausgeführt
     } 
     }
    
    Die Pushmethode des Stacks

    Code:
     
     public void push(int a)
     {
     ele h = new ele();
     h.value = a;
     h.next = tos;
     tos = h;
     }
    
    Die Addmethode des Applets

    Code:
    public void add(int a)
     {
     n++; // s.o.
     Stack.push(a); // Ruft die Pushmethode des Stacks aus
     box2.setText(null); //Für diesen Teil irrelevant
     }
    
    Alle anderen Methoden die die Pushmethode des Stacks / die Addmethode des Arrays nutzen funktionieren.

    Danke im vorraus.
     
  2. 4. November 2010
    AW: Anfängerhilfe Stack

    hast du deine alle methoden in deiner stack klasse statisch gemacht?
    wenn ja, wäre das schonmal ein falscher ansatz. was ist tos? einfach mal bitte die komplette stack klasse posten.

    gruß
     
  3. 4. November 2010
    AW: Anfängerhilfe Stack

    ^ Dummerweise habe ich derzeit keinen zugrief auf die Stack Klasse, aber tos gibt jeweils das element an, welches derzeit Oben auf dem Stack liegt.
    Die Klassen sind nicht statisch.

    Falls es hilft schreibe ich hier noch gerade, was die Klassen ele und stack tun:

    Stack:
    Der Stack hat die Methoden:
    push(int), welche ein neues Element zum Stack hinzufügt, dam neuen element (im beispiel "h") wird dabei der wert aus dem int parameter hinzugefügt, sowie die variable "next" welche auf das element davor zeigt, also das derzeitge "tos" (top of stack). Dadurch entsteht eine kette, Ele->Ele->Ele , bei der das jeweilis oberste Element auf das unter ihm zeigt.
    pop(), sorgt dafür, das der tos auf das element unter dem derzeitigen tos gesetzt wird.
    top(), gibt den wert des tos elements zurück

    Ele(Element): Das Element beinhaltet nur die Integer Variable "value" die den wert speichert dem es zugewiesen wird, und eine Variable "next" welche ebenfalls ein Element ist und auf das element unter ihm zeigt.

    Edit:
    So, nun noch die Quelltexte von Ele und stack

    Code:
    public class stack
    {
     ele tos;
     
     public stack()
     {
     
     }
     
     public void push(int a)
     {
     ele h = new ele();
     h.value = a;
     h.next = tos;
     tos = h;
     }
     
     public String top()
     {
     if(empty()) return "Empty" ;
     else return Integer.toString(tos.value);
     }
     
     public void pop()
     {
     if(empty()) return;
     else tos = tos.next;
     }
     
     public boolean empty()
     {
     if(tos == null) return true;
     else return false;
     }
    }
    
    Code:
    public class ele extends Object
    {
     public int value;
     public ele next, from;
     }
    
     
  4. 4. November 2010
    AW: Anfängerhilfe Stack

    Code:
    public void add(int a)
     {
     n++; // s.o.
     Stack.push(a); // Ruft die Pushmethode des Stacks aus
     box2.setText(null); //Für diesen Teil irrelevant
     }
    
    Stack.push(a) sieht so aus, als würdest du die statische Methode push() von einer Stack-Klasse aufrufen und nicht die Methode einer variable.

    Also ohne die ganze Klasse zu sehen ist es Schwer einen Fehler zu finden, aber mir sind ein paar andere Dinge aufgefallen:

    Code:
    public class ele extends Object
    {
     public int value;
     public ele next, from;
     }
    
    Klassennamen sollten immer mit einem Großbuchstaben beginnen. Das "extends Object" brauch nicht explicit angegeben werden, da jede Klasse von Object erbt.

    Code:
    if(empty()) return "Empty" ;
    else return Integer.toString(tos.value);
    
    Wenn empty() true zurückgibt wird mit return eh die Methode verlassen, da ist das else also überflüssig.

    Die Methode empty könntest du noch so verkürzen:
    Code:
    return (tos == null);
    
    In der Methode readIt() erhöhst du inder Schleife n jedesmal um eins. Du könntest auch einmal vor der Schleife
    Code:
    n += tempList.length;
    
     
  5. 5. November 2010
    AW: Anfängerhilfe Stack

    Aber die Klasse stack hab ich doch geposted ?( .

    Das "extends Object" hab ich auch gesehen als ich den Quelltext geposted hab und dann entfernt.
     
  6. 7. November 2010
    AW: Anfängerhilfe Stack

    Als erstes solltest du prüfen wo und ob du eine Zeile hast die in etwa so aussehen könnte:

    Code:
    Stack myStack = new Stack();
    
    Mir scheint als würdest du im Applet Stack als statisches Objekt behandeln. Das kann zu Fehlern verursachen. Zusätzlich solltest bedenken, dass dein Stack hier ausschließlich Objekte vom Typ "ele" (wie wäre es mit "Element"?) enthält. Hier ist es ratsam generics zu verwenden:

    Code:
    public class Stack<T>
    {
     T tos; // schreib das mal etwas mehr aus "tos" ist zu kurz
    
     ...
     ...
    }
    
    Letztenendes muss die Stackinstanziierung so aussehen, falls du generics nutzen willst:

    Code:
    Stack<ele> myStack = new Stack<ele>();
    
     
  7. 5. Dezember 2010
    AW: Anfängerhilfe Stack

    Ich würde niemals die Schablone "ele" taufen, bennene sie als Data oder Info das sieht besser aus finde ich. Niemals Variablen oder Konstanten public lassen. Info ist eine reine Klasse für die Daten bzw. Information, baue dir noch eine Knoten-klasse die, die Infos verbindet.

    Das ist jetzt für reine interger Werte. Die Knotenklasse schreibe selber.

    Code:
    public class Info{
    
     private int value;
    
     public Info(int data){
     this.setInfo(data);
     }
    
     public Info(){
     this(0);
     }
    
     private setInfo(int info){
     this.value = info;
     }
    
     public getInfo(){
     return this.value;
     }
     }
    
    Ich hoffe das wolltest du jetzt auch so.
     
  8. 6. Dezember 2010
    AW: Anfängerhilfe Stack

    Man bräuchte noch den kompletten codes Applets wollen einige sagen
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.