Welches Ende hat der Kopf in einer Warteschlange?

18

Ich hatte immer gedacht, dass der "Kopf" einer Warteschlange das nächste zu lesende Element ist, und diese Verwendung nie wirklich in Frage gestellt. Eine Bibliothek mit verknüpften Listen, die ich geschrieben habe und die zum Verwalten von Warteschlangen verwendet wird, hat diese Terminologie kodiert: Wir haben ein list1_headMakro, das das erste Element abruft; Wenn Sie diese Bibliothek in einer Warteschlange verwenden, ist dies das erste zu entfernende Element.

Ein neuer Entwickler im Team war es jedoch gewohnt, Warteschlangen umgekehrt implementieren zu lassen. Er beschrieb eine Warteschlange als ein Hund: Sie setzen am Kopf ein und entfernen am Schwanz. Dies ist eine kluge Beschreibung, die meiner Meinung nach weiter verbreitet sein muss, und ich habe keine ähnlich aussagekräftige Beschreibung meiner bevorzugten Verwendung.

Also, ich denke, es gibt zwei verwandte Fragen: 1, was bedeutet der "Kopf" einer Warteschlange für Sie? und 2, warum verwenden wir das Wort "Kopf", um dieses Konzept zu beschreiben?

Aidan Cully
quelle
1
"Er beschrieb eine Warteschlange als sich wie ein Hund benehmend" ... Klingt nach einem lustigen Typ, mit dem man arbeiten kann - lassen Sie ihn nicht in die Nähe eines Kunden.
NoChance
1
Ich weiß es nicht, aber ich hätte Ihre Implementierung erraten, nicht die des Hundes.
Izkata
Eine weitere gute Erklärung für den Unterschied zwischen QUEUE und STACK: http://pages.cs.wisc.edu/~mcw/cs367/lectures/stacks.html
Ythalo Rossy
In Lehrbüchern wird die (einfach) verknüpfte Liste häufig vor anderen Datenstrukturen wie Stapel und Warteschlange eingefügt, und diese werden dann über der verknüpften Listenstruktur erstellt (was heutzutage nicht unbedingt der bevorzugte Weg ist, diese Datenstrukturen zu erstellen von Cache-Misses). Eine verknüpfte Liste enthält häufig einen Kopfzeiger (bezieht sich auf das erste Element) und einen Endzeiger (auf das letzte Element). In dieser Anordnung ist es einfach, das hintere Ende vom Kopf zu entfernen. In einer solchen FIFO-Warteschlange entfernen Sie es also von vorne. Beachten Sie jedoch, dass dies wirklich ein internes Implementierungsdetail ist.
Filip Milovanović
Übrigens, denken Sie, es ist teilweise eine sprachbezogene Sache, aber es geht auch darum, wie wir uns vorstellen, was eine Warteschlange tut. Für die meisten Menschen, die die Bedeutung des Wortes "Warteschlange" kennen oder mit dieser Metapher in das Konzept eingeführt werden (in der Schlange warten), befindet sich der Ausgangsteil vorne / oben. Ich vermute, Ihr Freund stellt es sich eher als eine Art Pipeline-Sache vor, bei der Sie Objekte an ein Ende (den Anfang oder in gewisser Weise den "Kopf") der Pipe schieben und sie am anderen Ende wieder verlassen.
Filip Milovanović

Antworten:

29

Sie treten hinten in die Warteschlange ein und verlassen sie von vorne. In den meisten Gesellschaften bedeutet dies, dass der Kopf die Vorderseite ist und die Gegenstände vom Kopf entfernt werden.

Der Javadoc for Queue scheint mit der klassischen Definition (dh Ihrer ursprünglichen) übereinzustimmen:

Unabhängig von der verwendeten Reihenfolge ist der Kopf der Warteschlange das Element, das durch einen Aufruf von remove () oder poll () entfernt werden würde. In einer FIFO-Warteschlange werden alle neuen Elemente am Ende der Warteschlange eingefügt.

Spencer Kormos
quelle
4
Die C ++ STL stimmt ebenfalls zu.
Fabio Ceconello
Ebenfalls gebräuchliche Terminologie für FIFO / LIFO ist das Entfernen vom oberen Rand der Warteschlange / des Stapels. Die Spitze des Hundes ist der Kopf, nicht der Schwanz. :-D
Spencer Kormos
Es scheint, dass Sie die erste Frage beantwortet haben. Normalerweise ist die Verwendung, die ich verstanden habe, traditionell. Vielen Dank für die Hinweise. Aber es ist nicht so eisern für mich, warum die Vorderseite der Warteschlange der "Kopf" genannt wird ...
Aidan Cully
... also in welcher Öffnung des Hundes werden Gegenstände in die Warteschlange gestellt? ;)
ell
1
Der Schwanz eines Hundes ist der Kopf der Schlange.
Caleb
8

Was Leute in den Vereinigten Staaten gewöhnlich eine Leitung nennen, wie in der Sache, in der Sie bei der Post stehen, nennen Leute in anderen englischsprachigen Ländern eine Warteschlange. So ist es für Amerikaner einfacher, die Terminologie klar zu halten, wenn Sie "Warteschlange" durch "Zeile" ersetzen. Mit anderen Worten, wenn Sie sich im Kopf oder vor der Leitung befinden, sind Sie der nächste, der angerufen wird.

Karl Bielefeldt
quelle
Vielleicht handelt es sich dann eher um eine Frage zum Englischen, denn das Problem, das aufgetaucht zu sein scheint, ist: "Warum nennen wir die Front den Kopf?"
Aidan Cully
3
@AidanCully: weil der Kopf eines Körpers (bei Vierbeinern und anderen Tieren horizontal ausgerichtet) nach vorne oder vorne zeigt.
outis
Das ist die bestmögliche Erklärung für uns Amerikaner.
undDevW
4

Beide Konventionen sind allgemein gebräuchlich. Meiner Erfahrung nach kommt bei Warteschlangen im Allgemeinen als Nächstes das Element head aus der Warteschlange, und am Ende treten Elemente in die Warteschlange ein. Dies steht im Einklang mit dem alltäglichen englischen Sprachgebrauch - wir stellen uns hinten in die Schlange und der nächste, der serviert wird, ist vorne oder am Kopf. (Und wenn Sie schneiden, ist es für Sie ganz hinten in der Zeile!)

Wenn jedoch eine Warteschlange (auch als FIFO bezeichnet) als Ringpuffer implementiert ist , werden die Begriffe normalerweise umgekehrt, da der verwendete Teil des Ringpuffers einer Schlange ähnelt, die sich in einem Kreis bewegt. Vorausgesetzt, die Schlange bewegt sich vorwärts, ist der Kopf natürlich das Ende, das die Bewegung führt, und das ist auch das Ende, an dem eingehende Gegenstände eingefügt werden.

IJ Kennedy
quelle
Erwähnenswert sind kreisförmige Puffer im Linux-Kernel , bei denen die Konvention verwendet wird, dass Elemente am Anfang hinzugefügt und am Ende entfernt werden.
Craig McQueen