ArrayQueue - enqueue Methode

Diskutiere ArrayQueue - enqueue Methode im Java Basics - Anfänger-Themen Bereich.
D

DanielaLima

Hallo zusammen,

könnte mir jemand bei dem Verständnis dieser Methode helfen.
Es ist eine Methode aus einer ArrayQueue Klasse, die ein weiteres Element zum Array hinzufügt. Falls weiterer Code erforderlich ist, bitte sagen!
@Override
public void enqueue(E e) throws FullQueueException {
if (!full()) {
queue[tail] = e;
if (++tail == queue.length) {
tail = 0;
}
} else {
throw new FullQueueException("Die Queue ist voll!");
}
}

Also, meine Frage bezieht sich auf die Zweite if-Abfrage.

Im Grunde verstehe ich was passiert, die Methode funktioniert auch wie sie soll.
zunächst was ich verstehe:
In der Abfrage wird noch VOR dem Vergleich mit queue.lenght verglichen. Heißt, zunächst wird geprüft, ob die queue überhaupt voll ist

(full.methode, wenn head ==0 und tail == queue.lenght ODER wenn tails +1 = head (also bildlich tail links neben head))

wenn nicht voll, wird das neue element auf die LEERE position gesetzt auf die tail gerade zeigt.
tail wird in der nächsten if abfrage ja dann also sofort um 1 erhöht , zeigt auf die nächste LEERE position, und mit der länge vergleichen.

so, jetzt stell ich mir vor, dass ich eine queue der länge 5 habe,
hier können dann nur 4 plätze belegt werden, weil ..siehe full-methode

die Positionen 0,1,2 sind belegt, tao zeigt auf 3
ich führe die enqueue methode aus, element wird auf position 3 hinzugefügt
tail wird um 1 erhöht und zeigt auf die letzte position 4 ,
warum geht er nicht die operation der bedingung und setzt tail = 0, (WAS er ja auch nicht soll), ich
kann nur nicht nachvollziehen warum das so ist (hat aber wahrscheinlich mit dem PRÄinkrement zu tun???

danke und sorry für den langen text

LG
 
J

JustNobody

Erst einmal: Was spricht denn dagegen, das in zwei Zeilen zu schreiben? Also statt
if (++tail == queue.length)
einfach
Java:
tail++;
if (tail == queue.length)
Also gerade als Anfänger sollte man sich seinen eigenen Code nicht komplexer als unbedingt notwendig machen!

Und tail wird nur erhöht, wenn etwas eingefügt wird, oder? Da nach dem erhöhen direkt geprüft wird, ob er am Ende ist, wird die Bedingung head ==0 und tail == queue.lenght niemals wahr sein. Die Bedingung soll doch prüfen, ob head auf dem ersten und tail auf dem letzten Element ist. Das erste Element ist 0 (korrekt) aber das Letzte ist doch auf queue.length - 1!

Und das kann man dann auch etwas anders machen, wenn man will. Die Frage ist doch, ob tail vor head ist, also head == tails+1, wobei aber bei queue.length umgebrochen werden soll - das geht über eine % Operation. head = (tails +1) % queue.length.
==> Dann hätte man eine einzelne Abfrage. Aber natürlich kann man den Sonderfall: tails = queue.length -1 und head = 0 auch weiter separat abprüfen (Aber bitte korrekt mit length-1!).

Und diese Frage:
so, jetzt stell ich mir vor, dass ich eine queue der länge 5 habe,
hier können dann nur 4 plätze belegt werden, weil ..siehe full-methode

die Positionen 0,1,2 sind belegt, tao zeigt auf 3
ich führe die enqueue methode aus, element wird auf position 3 hinzugefügt
tail wird um 1 erhöht und zeigt auf die letzte position 4 ,
warum geht er nicht die operation der bedingung und setzt tail = 0, (WAS er ja auch nicht soll), ich
kann nur nicht nachvollziehen warum das so ist (hat aber wahrscheinlich mit dem PRÄinkrement zu tun???
Durch das Umschreiben wird es hoffentlich ersichtlich. Du hast nur ein hochzählen - innerhalb der Abfrage. Wieso sollte er denn auch zwei Mal hochzählen?
Daher: Macht nur ein Befehl pro Zeile wenn es geht. Dann behaltet Ihr den Überblick und kommt nicht durcheinander!
 
D

DanielaLima

Ok, ich habe meinen Denkfehler erkannt!
So simpel. Tail fängt ja, wie der Index bei 0 an, so vorgegeben im Konstruktor .
die Anzahl jedoch nicht! also ist der Wert queue.lenght = 5 und tail = 4. Deshalb ist das auch nicht gleich!!
Danke für deine Erklärung, das hat auch nochmal einiges erleuchtet :D:D
 
Thema: 

ArrayQueue - enqueue Methode

Passende Stellenanzeigen aus deiner Region:
Anzeige

Anzeige

Anzeige
Oben