LIFOのアイテムの境界スタックを保持するデータ構造は何ですか?
-
03-07-2019 - |
質問
基本的に境界スタックであるデータ構造を探しています。
スタックが最大3つのアイテムを保持できることを宣言し、別のアイテムをプッシュすると、 最も古いアイテムがポップされます。
解決
LIFO(Last In First Out)構造は、要件の主要部分に必要なスタックとして知られています
FIFO(先入れ先出し)構造は、最も古いアイテムを後ろからポップする機能に必要なキューと呼ばれます。
これらの組み合わせは、Dequeとして知られています。いずれかの端からプッシュまたはポップする機能が必要な場所。
JavaにDequeデータ構造が組み込まれているかどうかはわかりませんが、もしそれがあれば(またはGoogleで実装を見つけることができます)、ラップロジックを配置して、最前面にプッシュすることを確認できます、およびdeque.Count> 3、次に背面からもポップします。
他のヒント
dequeのラッパーを使用してこれを実装できます( http:// en。 wikipedia.org/wiki/Deque )、または両端キュー。スタックサイズに達した場合は、必ずofferFirstメソッド内でpollLastメソッドを呼び出してください。
キューが必要です。最初と最後のアイテムを記録する単一リンクリスト。 O(n)からO(1)トラバーサルに変更して最後のアイテムを更新する場合は、二重にリンクされたもの。
キューの先頭でオブジェクトをプッシュします。また、長さが3より大きい場合は、後ろに飛び出します。
これはC#で、Javaがわからないので怖いですが、アイデアは翻訳する必要があります。
public class BoundedStack<T>
{
private readonly int limit;
private LinkedList<T> list;
public BoundedStack(int limit)
{
this.limit = limit;
list = new LinkedList<T>();
}
public void Push(T item)
{
if (list.Count == limit) list.RemoveFirst();
list.AddLast(item);
}
public T Pop()
{
if (list.Count == 0)
throw new IndexOutOfRangeException("No items on the stack");
var item = list.Last.Value;
list.RemoveLast();
return item;
}
public int Count()
{
return list.Count;
}
}
Apache commonsには、Fifo以外に必要なものに近いものがあります: CircularFifoBuffer 。 Lifoのような実装を行うためのカスタムラッパーの作成に追われていると思います。
これは、Garry Shutlerの答えに触発された、私のLIFOの実装です
public class BoundedStack<T> {
private int limit;
private LinkedList<T> list;
public BoundedStack(int limit) {
this.limit = limit;
list = new LinkedList<>();
}
public void push(T item) {
if (list. size() == limit) {
list.removeLast();
}
list.addFirst(item);
}
public int size() {
return list.size();
}
public List<T> getAll() {
return list;
}
public T peek() {
return list.get(0);
}
}