it-swarm.com.de

Java-Sammlungen (LIFO-Struktur)

Ich suche im Collections-Framework von Java nach einer LIFO - Struktur (Stack), jedoch ohne Erfolg. Grundsätzlich möchte ich einen wirklich einfachen Stack. Meine perfekte Option wäre ein Deque, aber ich bin in Java 1.5.

Ich möchte meiner Struktur keine weitere Klasse hinzufügen, frage mich aber, ob das möglich ist:

  1. Gibt es eine Klasse im Collections-Framework (1.5), die die Aufgabe erfüllt?

  2. Wenn nicht, gibt es eine Möglichkeit, eine Warteschlange in einer LIFO - Warteschlange (aka Stack) umzuwandeln, ohne sie erneut implementieren zu müssen?

  3. Wenn nicht, welche Schnittstelle oder Klasse sollte ich für diese Aufgabe erweitern? Ich denke, dass der Weg, den die Jungs von Sun mit dem Deque gemacht haben, ein guter Anfang ist.

Danke vielmals.

EDIT: Ich habe vergessen, über die Stack-Klasse zu sagen: Ich habe Zweifel an dieser Klasse, als ich sah, dass sie die Vector-Klasse implementiert, und die Vector-Klasse ist ein wenig veraltet, oder?

33

Es gibt tatsächlich eine Stack-Klasse: http://Java.Sun.com/j2se/1.5.0/docs/api/Java/util/Stack.html

Wenn Sie das nicht verwenden möchten, hat die LinkedList-Klasse ( http://Java.Sun.com/j2se/1.5.0/docs/api/Java/util/LinkedList.html ) die Variablen addFirst und addLast. und removeFirst und removeLast, wodurch sie ideal als Stack- oder Warteschlangenklasse verwendet werden kann.

50
Eli Courtwright

Stack Klasse ist langsam: Methoden werden synchronisiert + Stac k erweitert synchron Vector

8
Spy_DER

Ich weiß, dass ich zu spät zur Party komme, aber Java.util.Collections (Java 7) hat eine statische 'asLifoQueue', die ein Deque-Argument akzeptiert und (offensichtlich) a LIFO Warteschlangenansicht der Deque zurückgibt . Ich bin nicht sicher, welche Version hinzugefügt wurde.

http://docs.Oracle.com/javase/7/docs/api/Java/util/Collections.html#asLifoQueue(Java.util.Deque)

8
JVMATL

Es gibt eine Stack-Klasse in der API . Wird dies Ihren Bedürfnissen entsprechen?

6
Greg

Während dies vor einiger Zeit gefragt wurde, ist es möglicherweise ratsam, eine JDK6 + -Antwort bereitzustellen, die jetzt eine Deque (Deck) -Schnittstelle enthält, die von der ArrayDeque - Datenstruktur implementiert wird und die LinkedList aktualisiert wurde um diese Schnittstelle zu implementieren. Es gibt auch spezielle Formulare für den gleichzeitigen Zugriff, die von ConcurrentLinkedDeque und LinkedBlockingDeque implementiert werden.

Das Beste an einem Deque ist, dass es sowohl die Unterstützung von LIFO (Stapel) als auch FIFO (Warteschlange) bietet. Dies kann zu Verwirrung darüber führen, welche Methoden für Warteschlangenoperationen und welche für Stapeloperationen verwendet werden für Neuankömmlinge.

IMHO das JDK sollte über eine Stack-Schnittstelle und eine Queue-Schnittstelle verfügen, die noch wie ArrayDeque implementiert werden könnten, aber nur die für diese Struktur erforderliche Teilmenge von Methoden verfügbar machen, dh ein LIFO könnte pop(), Push() definieren. und peek(), dann im Kontext von

LIFO<String> stack = new ArrayDeque<>();

es werden nur Stapeloperationen verfügbar gemacht, die verhindern, dass jemand versehentlich add (E) anruft, wenn Push (E) beabsichtigt war.

6
Brett Ryan

Der Vollständigkeit halber gebe ich ein Dequeue und ein reines LinkedList-Beispiel.

Verwenden der Dequeue-Schnittstelle in Kombination mit einer LinkedList (empfohlen):

    Deque<String> dequeue = new LinkedList<>();
    dequeue.add("first");
    dequeue.add("last");

    // returns "last" without removing it
    System.out.println(dequeue.peekLast());

    // removes and returns "last"
    System.out.println(dequeue.pollLast());

Das Sichern eines Dequeue durch eine LinkedList ist für die Leistung hervorragend, da das Einfügen und Entfernen von Elementen in konstanter Zeit erfolgt (O (1)).

Nur eine LinkedList verwenden:

    LinkedList<String> list = new LinkedList<>();
    list.add("first");
    list.add("last");

    // returns "last" without removing it
    System.out.println(list.getLast());

    // removes and returns "last"
    System.out.println(list.removeLast());
0
Ivo