7

System.Collection.Generics.Stackの深さを制限する組み込みの方法はありますか?最大容量の場合、新しい要素を押すとスタックの一番下が削除されますか?

配列に変換してスタックを再構築することでそれができることは知っていますが、おそらくすでにメソッドがあると思いました。

編集:私は拡張メソッドを書きました:

    public static void Trim<T> (this Stack<T> stack, int trimCount) 
    {
        if (stack.Count <= trimCount)
            return;

       stack = new 
            Stack<T>
            (
                stack
                    .ToArray()
                    .Take(trimCount)
            );           
    }

したがって、トリミング時に新しいスタックを返しますが、機能的な方法で不変ではありません=)

これは、アプリの元に戻るステップをスタックに保存していて、限られた量のステップのみを保存したいためです。

4

5 に答える 5

23

あなたが探しているものは、ドロップアウト スタックと呼ばれます。私の知る限り、実装は簡単ですが、BCLには含まれていません。通常、元に戻す機能とやり直し機能は、このようなデータ構造に依存しています。

それらは基本的に配列であり、スタックにプッシュすると、スタックの「トップ」が配列内を移動します。最終的に、スタックがいっぱいになると、一番上が先頭に戻り、スタックの「一番下」が置き換えられます。

Googleはそれについて多くの情報を提供しませんでした. これは私が見つけることができる最高のものです:

(警告 PDF) http://courses.cs.vt.edu/~cs2704/spring04/projects/DropOutStack.pdf

開始するための定型コードを次に示します。残りはあなたに記入してもらいます (サニティ チェック、カウント、インデクサーなど)。

class DropOutStack<T>
{
    private T[] items;
    private int top = 0;
    public DropOutStack(int capacity)
    { 
        items = new T[capacity];
    }

    public void Push(T item)
    {
        items[top] = item;
        top = (top + 1) % items.Length;
    }
    public T Pop()
    {
        top = (items.Length + top - 1) % items.Length;
        return items[top];
    }
}
于 2008-12-21T04:37:15.270 に答える
4

実際には、循環リストの実装に似たものを見ています。CodeProject のPIEBALDconsult によって行われたLimitedQueue実装があります。それはあなたの要件に似ています。作成者が行ったように、Queue の代わりに Stack をラップするだけです。さらに、作成者はインデクサーも実装しました。これは、トップ スタック以外のものにアクセスする必要がある場合に便利です (元に戻すリストを表示するためなど)。

編集: 作成者の実装では、最後 (最初、それがキューかスタックかによって異なります) が削除されたときにもイベントが発生するため、何かが破棄されていることを知ることができます。

于 2008-12-21T04:41:48.083 に答える
2

道が見えない。から継承することはできますがStack<T>、オーバーライドするのに役立つものは何もないようです。

簡単な(少し退屈な場合)方法はStack<T>、たとえば、を自分でラップすることLimitedStack<T>です。次に、必要なメソッドを実装して内部Stack<T>に渡します。その一方で、メソッドに制限ロジックを含め、Pushその他の必要な場所に渡します。

これらすべてのパススルーメンバーを作成するのは面倒です。特に、Stack<T>...と同じインターフェイスをすべて実装している場合はそうですが、その一方で、一度だけ実行すれば完了します。

于 2008-12-21T03:12:59.870 に答える
2

あなたが探しているのは、(変更されている可能性がある)デキュー(両端からのアクセスを許可するデータ構造) だと思います。

于 2008-12-21T03:36:22.800 に答える