FIFO-basierte Warteschlangenimplementierungen?


Antworten:


86

Ja. Warteschlange

LinkedList ist die trivialste konkrete Implementierung.


5
Beachten Sie, dass der Javadoc alle Implementierungen auflistet. Auch der zweite Link darüber zuLinkedList
John B

2
LinkedListist keine Schnittstelle; Es ist eine explizite Klasse. Alternativ ArrayDequeist häufig schneller.
Louis Wasserman

Ich muss meine Warteschlange nicht jederzeit ändern, die Anzahl der Elemente ist immer konstant.
Rajat Gupta

Gibt es Unterschiede zwischen ArrayDeque und ArrayQueue?
Rajat Gupta

3
Dies ist eigentlich nicht wahr: Laut Javadoc ist Queue nicht unbedingt FIFO: docs.oracle.com/javase/7/docs/api/java/util/Queue.html . LinkedList kann als Warteschlange verwendet werden, da die Reihenfolge jedoch festgelegt ist.
Pieter Bos

60

Hier ist ein Beispielcode für die Verwendung der in Java integrierten FIFO-Warteschlange:

public static void main(String[] args) {
    Queue<Integer> myQ = new LinkedList<Integer>();
    myQ.add(1);
    myQ.add(6);
    myQ.add(3);
    System.out.println(myQ);   // 1 6 3
    int first = myQ.poll();    // retrieve and remove the first element
    System.out.println(first); // 1
    System.out.println(myQ);   // 6 3
}

14

ArrayDequeist wahrscheinlich die schnellste objektbasierte Warteschlange im JDK; Trove hat die TIntQueueSchnittstelle, aber ich weiß nicht, wo die Implementierungen leben.


8
Um ArrayDequeals Warteschlange (FIFO) und nicht als Stapel (LIFO) zu fungieren, sollten Sie addund verwenden remove. Wenn Sie pushund verwenden pop, verhält es sich wie ein Stapel. (Genau genommen removeund popsind die gleichen, aber da add/popoder push/removenicht gut als Paare klingen, gehen wir mit add/removeund push/pop.)
ADTC

5

Queueist eine Schnittstelle, die Collectionin Java erweitert wird. Es verfügt über alle Funktionen, die zur Unterstützung der FIFOArchitektur erforderlich sind .

Für die konkrete Umsetzung können Sie verwenden LinkedList. LinkedList implementiert, Dequewas wiederum implementiert Queue. All dies ist Teil des java.utilPakets.

Einzelheiten zur Methode mit Beispielbeispiel finden Sie in der FIFO-basierten Warteschlangenimplementierung in Java .

PS: Der obige Link führt zu meinem persönlichen Blog, der zusätzliche Details dazu enthält.


4

Eine LinkedList kann als Warteschlange verwendet werden - Sie müssen sie jedoch richtig verwenden. Hier ist ein Beispielcode:

@Test
public void testQueue() {
    LinkedList<Integer> queue = new LinkedList<>();
    queue.add(1);
    queue.add(2);
    System.out.println(queue.pop());
    System.out.println(queue.pop());
}

Ausgabe :

1
2

Denken Sie daran , wenn Sie Push anstelle von Add verwenden (was Sie sehr wahrscheinlich intuitiv tun werden), wird dadurch ein Element am Anfang der Liste hinzugefügt, sodass es sich wie ein Stapel verhält.

Dies ist also nur dann eine Warteschlange, wenn sie in Verbindung mit add verwendet wird.

Versuche dies :

@Test
public void testQueue() {
    LinkedList<Integer> queue = new LinkedList<>();
    queue.push(1);
    queue.push(2);
    System.out.println(queue.pop());
    System.out.println(queue.pop());
}

Ausgabe :

2
1
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.