# Queue



## SchülerausHP (10. Jan 2014)

Sehr geehrte Community,
ich muss für die Schule eine Queue in Java implementieren und dies auch erklären können. Ich habe aber keine Ahnung wie ich das machen soll.
Kann mir bitte jemand von Euch bei der folgenden Aufgabe helfen:

Implementiert ein Java-Programm über das alphanumerische Werte eingegeben werden können, die im der Datenstruktur der Queue gespeichert werden. Dabei kann es sich um ein 
a.	Ausbaustufe I: Konsolenprogramm handeln oder um ein 
b.	Ausbaustufe II: Programm mit graphischer Benutzeroberfläche (GUI)

Am besten wäre es, wenn eine Kleine Erklärung dabei wäre damit ich auch verstehe was da passiert.
Vielen Dank schon mal im Vorraus!!!

PS: Habe schon im Internet nach einer Anleitung gesucht, aber die sind alle unterschiedlich und ich verstehe die Erklärungen dazu nicht ;(.


----------



## Gucky (10. Jan 2014)

Ein Queue ist ja eine Warteschlange. Soll es eine werden mit unterschiedlichen Prioritäten?

Du kannst das mit einer einfach verketteten Liste machen. Ähnlich einer LinkedList. Du hast eine Steuerklasse und eine private Klasse Knoten. Die Steuerklasse setzt bei einem neuen Element einen oben auf den Stapel rauf und nimmt bei Abarbeitung einen runter. Schreib mal genau deine Fragen auf, damit ich dir genau auf diese antworten kann.


----------



## SchülerausHP (10. Jan 2014)

Erstmal Danke für deine schnelle Antwort Gucky,
ich will eine einfache Warteschlange, bei der man Werte eingeben und diese dann nachdem FIFO-Prinzip ausgeben kann, in Java implementieren. 
Kannst Du mir dazu einen Code schreiben?(weil ich das nicht schaffe)
Leider weiß ich nicht was du mit " LinkedList","Steuerklasse" und "private Klasse Knoten" meinst also kann ich dir leider nicht sagen was ich davon will.
Hoffe es Du kannst mir trotzdem helfen.


----------



## Gucky (10. Jan 2014)

Zum Code schreiben siehe Signatur.  Es bringt dir nichts, wenn ich den Code für dich schreibe, weil du hinerher so schlau bist wie zuvor. Mit dem Unterschied, dass du dann den Code hast. Spätestens, wenn du ihn erklären musst, bist du am A****. Deshalb schreib ihn lieber selber. Ich werde dir aber gerne helfen. 


Eine LinkedList ist eine Liste, in der es sog. "Knoten" gibt, die über beiderseitige Verkettung "verbunden" sind. Eine LinkedList ist so aufgebaut:

ersterKnoten         Knoten 2          Knoten 3         letzterKnoten

Jeder Knoten hat eine Variable 
	
	
	
	





```
Knoten next
```
 und eine 
	
	
	
	





```
Knoten pref
```
. Beide sind von Haus aus 
	
	
	
	





```
null
```
. Das wird im Konstruktor dieser Klasse so festgelegt. In diesen Variablen wird ihrem Namen entsprechend eine Referenz auf ein anderes Knotenobjekt gespeichert.

Die unterschiedliche Benennung weißt darauf hin, dass dem ersten und dem letzten Knoten eine besondere Bedeutung zukommt.
Diese Knoten sind separat in je einer Variable vom Typ Knoten in der Steuerklasse gespeichert. Irgendwie muss die Steuerklasse ja darauf zugreifen können. Sonst hättest du toten Speicher, der schnell vom GC aufgeräumt würde.

Die Steuerklasse ist die eigentliche Klasse, die bei Benutzung Instanziiert wird. Die Klasse Knoten ist 
	
	
	
	





```
private
```
 also nur für die Steuerklasse sichtbar.

In der Steuerklasse sind sämtliche Methoden, um die Liste zu steuern. add(), size(), remove(), etc.
Willst du die gesamte Liste löschen, musst du nur ersterKnoten und letzterKnoten auf 
	
	
	
	





```
null
```
 setzen. Der GC erledigt den Rest.



Deine Warteschlange ist ähnlich aufgebaut. Nur brauchst du hier nur eine Referenz pro Knoten. Und zwar next. In dieser Referenz ist der Knoten gespeichert, der zuvor hinzugefügt wurde.
Wenn ein neuer Knoten hinzugefügt wird, wird next auf den Knoten gesetzt, der zuvor in ersterKnoten gespeichert war und ersterKnoten wird auf den neuen Knoten gesetzt. Die Variable letzterKnoten ist in einer Warteschlange nicht vonnöten.
Soll ein Knoten herausgenommen werden, so speicherst du ihn in einer temporären Variable 
	
	
	
	





```
Knoten tempKnoten
```
 dann besorgst du dir seinen Vorgänger aus der next Variable, setzt ersterKnoten auf eben diesen und gibst den ehemals ersten Knoten zurück.

Ich hoffe, ich habe mich verständlich ausgedrückt


----------



## ARadauer (10. Jan 2014)

Ich frage mich, wann endlich selber geschriebene verkette Listen aus den Lehrplänen verschwinden...
Braucht in der Praxis kein Mensch.... da wärs sinnvoller wenn sie den Studenten zeigen wie sie debuggen und selber fehler finden können...


----------



## Gucky (10. Jan 2014)

Über den Lehrplan kann ich auch die eine oder andere Geschichte erzählen. 

Dadurch lernt man exemplarisch das Coden einer komplizierteren Aufgabe und es werden die ausgesiebt, die sowas nicht können. So könnte ich mir das erklären.


----------



## SchülerausHP (11. Jan 2014)

Vielen Dank Gucky,
ich glaube ich weiß jetzt wie ichs machen kann, aber ich hab ein Problem mit dem Anfang.
Ich will das man als erstes die Werte eingeben kann, die dann nach einander ausgegeben werden sollen, soll ich dies in einen neuen Bereich machen oder im "main"-Bereich? Und wo sollte ich die Funktion der Queue hinschreiben? Und danke nochmal das du mir alles erklärt hast.


----------



## Gucky (11. Jan 2014)

Kein Problem. Deshalb bin ich unter Anderem hier. 

Ich mache es immer so, dass die Klasse, in der die main Methode ist auch die Steuerklasse des gesamten Programmes ist. Da kann man sich drüber streiten, ob die main Methode in eine extra Klasse soll oder nicht. Ich mache es nicht so.
Du kannst eine Methode gibAlles() in der Queue machen, die alle Einträge in einem Array zurückgibt und die Queue löscht.
Du solltest versuchen, so viele Funktionen der Queue auch in die Klasse der Queue zu tun. Es sei denn es ist irgendwas abgefahrenes.
Oder hab ich dich falsch verstanden?


----------

