Hallo zusammen
Ich habe folgende Aufgabe:
1) Erstelle ein Programm welches den Turm von Hanoi wiedergibt.
2) Verwende dazu die Schnittstelle java.util.Iterator
zu 1)
Hier habe folgendes gemacht (Es funktioniert):
------------------------------
2) Dieses Technologie soll dazu verwendet werden:
Kann mir jemand hier sagen wo ich anfangen soll? Es wäre gut wenn ich eine Step by step erklärung hätte, damit ich wirklich verstehe was hier passiert.
Danke für eure Hilfe.
Ich habe folgende Aufgabe:
1) Erstelle ein Programm welches den Turm von Hanoi wiedergibt.
2) Verwende dazu die Schnittstelle java.util.Iterator
zu 1)
Hier habe folgendes gemacht (Es funktioniert):
Java:
public class Hanoi {
static void hanoiIter(int n)
{
int [][] bars = new int [3][n+1];
int [] lastPos = {n,0,0};
int posDisc = 0;
for(int i = 0; i<n+1; ++i) {
bars[0][i] = n+1-i;
}
bars[1][0] = n+1;
bars[2][0] = n+1;
while(bars[2][n]!=1){
System.out.printf("Kleinster Ring von %d nach %d\n\n",posDisc, (posDisc+1)%3);
bars[posDisc][lastPos[posDisc]--] = 0;
posDisc = (posDisc +1)%3;
bars[posDisc][++lastPos[posDisc]] = 1;
int pos1 = (posDisc+1)%3;
int pos2 = (posDisc+2)%3;
if(bars[pos1][lastPos[pos1]] > bars [pos2][lastPos[pos2]]){
System.out.printf("---> Ring von %d nach %d\n", pos2, pos1);
bars[pos1][++lastPos[pos1]] = bars[pos2][lastPos[pos2]];
bars[pos2][lastPos[pos2]--] = 0;
}else if (bars[pos1][lastPos[pos1]] < bars [pos2][lastPos[pos2]]){
System.out.printf("---> Ring von %d nach %d\n", pos1, pos2);
bars[pos2][++lastPos[pos2]] = bars[pos1][lastPos[pos1]];
bars[pos1][lastPos[pos1]--] = 0;
}
}
}
public static void main(String[] args) {
System.out.println("hanoi(3)");
hanoiIter(4);
}
}
2) Dieses Technologie soll dazu verwendet werden:
Java:
import java.util.Iterator;
public class ListeIterator<E> extends Liste<E> {
/**
* erzeugt Iteratorobjekt, mit dem die Liste durchlaufen werden kann
* @return
*/
public Iterator<E> iterator() {
return new Iterator<E>() { // anonyme Implementierung der Schnittstelle
private Knoten<E> k = aelteste;
public boolean hasNext() { return k != null; }
public E next() { Knoten<E> l = k; k = k.verbindung; return l.wert; }
public void remove() {} // leere Implementierung, da nicht benötigt
};
}
/**
* vergleicht zwei Liste-Objekte auf den gleichen Inhalt mit Hilfe des Iterators
* @param that wird mit this verglichen
* @return true wenn die beiden Listen denselben Inhalt haben
*/
public boolean istGleichIt(final ListeIterator<E> that) {
Iterator<E> dieser = this.iterator(), jener = that.iterator();
while (dieser.hasNext() && jener.hasNext())
if (dieser.next() != jener.next())
return false;
return dieser.hasNext() == jener.hasNext();
}
/**
* kopiert den Inhalt des Parameterobjekts mit Hilfe des Iterators
* @param that ist die Quelle, this is das Ziel des Kopiervorgangs
*/
public void kopierenIt(final ListeIterator<E> that) {
Iterator<E> jener = that.iterator();
aelteste = juengste = null; // this.entleeren();
while (jener.hasNext())
eintragen(jener.next());
}
/**
* Testtreiber
* @param args wird nicht benutzt
*/
public static void main(String[] args) {
try {
ListeIterator<Integer> s = new ListeIterator<Integer>();
System.out.println("Liste als Liste");
s.eintragen(new Integer(1));
s.eintragen(new Integer(2));
s.eintragen(new Integer(3));
s.eintragen(new Integer(4));
s.eintragen(new Integer(5));
System.out.println("Liste hat 5 Elemente");
ListeIterator<Integer> t = new ListeIterator<Integer>();
System.out.println("Kopieren & Vergleichen mit Iterator");
t.kopierenIt(s);
if (t.istGleichIt(s))
System.out.println("Zwei Listen gleich");
else
System.out.println("Fehler: Zwei Listen ungleich");
} catch (Exception e) {
System.out.println("LeerAusnahme");
}
}
}
Kann mir jemand hier sagen wo ich anfangen soll? Es wäre gut wenn ich eine Step by step erklärung hätte, damit ich wirklich verstehe was hier passiert.
Danke für eure Hilfe.