42

Java の Collections フレームワークで LIFO 構造 (スタック) を探していますが、成功していません。基本的に、本当にシンプルなスタックが必要です。私の完璧なオプションは Deque ですが、私は Java 1.5 を使用しています。

構造に別のクラスを追加する必要はありませんが、それが可能かどうか疑問に思っています:

  1. Collections フレームワーク (1.5) にその仕事をするクラスはありますか?

  2. そうでない場合、再実装せずに LIFO キュー (別名スタック) 内のキューを有効にする方法はありますか?

  3. そうでない場合、このタスクのためにどのインターフェイスまたはクラスを拡張する必要がありますか? Sun の担当者が Deque で作成した方法を維持することは、良いスタートだと思います。

どうもありがとう。

編集: Stack クラスについて言うのを忘れていました: このクラスが Vector クラスを実装しているのを見たとき、このクラスについて疑問があります。Vector クラスは少し時代遅れですよね?

4

6 に答える 6

59

実際には Stack クラスがあります: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Stack.html

それを使用したくない場合は、LinkedList クラス ( http://java.sun.com/j2se/1.5.0/docs/api/java/util/LinkedList.html ) にaddFirstandaddLastおよびremoveFirstandremoveLastメソッドがあり、スタックまたはキュー クラスとして使用するのに最適です。

于 2008-11-19T16:24:39.520 に答える
11

DequeArrayDeque、 &LinkedList

これは少し前に尋ねられましたが、 ArrayDequeデータ構造によって実装されるDeque (deck) インターフェイスを提供する JDK6+ の回答を提供するのが賢明かもしれません。このインターフェイスを実装するためにLinkedListが更新されました。

ConcurrentLinkedDeque&LinkedBlockingDeque

同時アクセス用の特殊なフォームも存在し、ConcurrentLinkedDequeおよびLinkedBlockingDequeによって実装されます。

LIFO と FIFO

deque の優れている点の 1 つは、LIFO (スタック) と FIFO (キュー) の両方のサポートを提供することです。どのメソッドがキュー操作用で、どのメソッドが新規参入者のスタック操作用であるかについて混乱を招く可能性があります。

IMHO JDKには、 ArrayDequeなどによって引き続き実装できるStackインターフェイスとインターフェイスが必要ですが、その構造に必要なメソッドのサブセットのみを公開します。つまり、LIFO は、およびを定義できますQueuepop()push()peek()

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

push(E)が意図されたときに誰かが誤ってadd(E)を呼び出すのを防ぐスタック操作のみが公開されます。

于 2015-02-28T22:25:09.357 に答える
8

スタッククラスが遅い: メソッドが同期されている +スタックが同期されているベクトルを拡張する

于 2008-12-22T14:04:19.680 に答える
7

API にはStack クラスがあります。これはあなたのニーズを満たしますか?

于 2008-11-19T16:24:08.180 に答える