Aufgabe: Stack mit Iterator

Derenei

Aktives Mitglied
Hier mal die Aufgabenstellung:

Erweitern Sie die von Ihnen programmierte Klasse Stack wie folgt:
Die Klasse Stack soll einem generischen Typ entsprechen ( class Stack<T> ...)
Die Klasse Stack soll mit einer for-Each Schleife durchlaufen werden können
Die Klasse muss somit das Interface Iterable implementieren
Somit muss eine Methode iterator():Interator implementiert werden, welche einen Iterator über den Stack zurückliefert (Methoden: next(), hasNext()
Ist euer Stack korrekt Programmiert, so sollte der folgende Programmcode in einer Main-Methode funktionieren:
MyStack<String> s = new MyStack<String>(100);
for (String t : s) {
sout(t);
}

Den Stack generisch zu machen hab ich schon erledigt:
Stack:

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mystack;

import java.util.Iterator;

/**
 *
 * @author Alexander
 */
public class Stack <T> implements Iterable{
    T []s;
    int length;
    
    @Override
    public Iterator iterator() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
    public Stack (int size){
        s = (T[]) new Object [size];
        length = 0;
    }
    
    public void push (T x){
        s[length++] = x;
    }
    
    public T pop(){
        return s[--length];
    }
}

Wie man sehen kann habe ich denn Iterator schon implementiert, aber ich verstehe nicht ganz was ich jetzt mit den Methoden next(), hasNext() machen soll und wie ich das jetzt in meinem Stack einbauen soll damit ich das ganze dann mit einer for each Schleife durchlaufen kann, ich hoffe Ihr könnt mir weiter helfen.

MFG,...

Alexander
 
Danke für deine Antwort, aber irgendwie verstehe ich das ganze nicht, wenn ich jetzt das Interface Iterable implementiere kann ich ja dann nicht die Mehtoden next() und hasNext() verwenden dazu muss ich doch das Interface Iterator implementieren.

Also jetzt bin ich total verwirrt.

MFG
 
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mystack;

import java.util.Iterator;
 
/**
 *
 * @author Alexander
 */
public class Stack <T> implements Iterable<T> {
    T []s;
    int length;
    
    @Override
    public Iterator<T> iterator() {
        return new StackIterator();
    }
    
    public Stack (int size){
        s = (T[]) new Object [size];
        length = 0;
    }
    
    public void push (T x){
        s[length++] = x;
    }
    
    public T pop(){
        return s[--length];
    }
	
	private class StackIterator implements Iterator<T> {
		@Override
		public boolean hasNext() {
			throw new UnsupportedOperationException("Not supported yet.");
		}

		@Override
		public T next() {
			throw new UnsupportedOperationException("Not supported yet.");
		}

		@Override
		public void remove() {
			throw new UnsupportedOperationException("Not supported yet.");
		}
	}
}
 
Zuletzt bearbeitet:
wieso keine liste?
is fürn stack nich ne schicke liste viel praktikabler?
vorallem hast erstens keine initialisierung mit ner festen größe
der kann also wachsen und schrumpfen wie er mag

und wenn du nen array hast solltest immer wieder auf die grenzen shcauen und gegebenenfalls exceptions werfen
zudem wär ne implementierung von ner liste viiieeellll einfacher...
 
[OT]
wieso keine liste?
is fürn stack nich ne schicke liste viel praktikabler?
vorallem hast erstens keine initialisierung mit ner festen größe
der kann also wachsen und schrumpfen wie er mag

und wenn du nen array hast solltest immer wieder auf die grenzen shcauen und gegebenenfalls exceptions werfen
zudem wär ne implementierung von ner liste viiieeellll einfacher...

Wenn man sich die Aufgabenstellung anschaut, könnte man meinen, dass der OP die Klasse Stack als Ausgangspunkt von seinem Lehrer, Professor, etc. bekommen hat. In dieser war wahrscheinlich dieses Array schon vorhanden. Und wenn man sich mal den Code von der implementiering der ArrayList anschaut, nutzen die ehemals Sun-Entwickler auch ein Array zur Datenhaltung:
Code:
 private transient Object[] elementData;

[/OT]
 
Danke für deine Antwort, aber irgendwie verstehe ich das ganze nicht, wenn ich jetzt das Interface Iterable implementiere kann ich ja dann nicht die Mehtoden next() und hasNext() verwenden dazu muss ich doch das Interface Iterator implementieren.

Also jetzt bin ich total verwirrt.
Dann schau doch noch mal genauer in das Interface [JAPI]Iteratable[/JAPI] was für einen Typ hat den dier Rückgabewert der dort deklarierten Methode, und was passiert in dieser Methode gerade in Deinem Code?

bye
TT
 
[OT]Irre ich mich, oder darf man bei einem Stack per Konvention nur auf das oberste Element zugreifen? Warum sollte man dann per foreach auf jedes Element des Stacks zugreifen..dann kann man auch gleich eine althergebrachte Liste nutzen. Der Sinn eines Stacks ist doch, dass man nur das oberste Element sieht, danach eine pop-Operation ausführen muss.[/OT]
 
[OT]@JRussian
ich sehe nicht zwingend einen Widerspruch, der Iterator scheint ja sowieso pop() verwenden zu müssen, oder auf das Array zugreifen?
mit pop(): einmal durchlaufen, dann ist der Stack leer 😉
[/OT]
 

Neue Themen


Zurück
Oben