C# 堆栈(Stack)

C# 集合

C# では、スタック(Stack)は後入れ先出し(LIFO, Last In First Out)のデータ構造です。

スタック(Stack)は、データを保存し順番に処理するのに適しており、最後に追加された要素が最初に削除されます。

スタック(Stack)は、后进先出オブジェクトのコレクション。各項目に後入れ先出しでアクセスする必要がある場合は、スタックを使用します。リストに項目を追加するときは、推入要素と呼びます。リストから項目を削除するときは、弹出元素。

Stack には2つの実装方法があります:

  1. 非泛型Stack(System.Collections.Stack):任意の型のオブジェクトを格納できます(ボックス化およびボックス化解除の操作が必要)。
  2. 泛型Stack<T>(System.Collections.Generic.Stack<T>):強く型指定されたオブジェクトをサポートし、ボックス化とボックス化解除を回避して、パフォーマンスを向上させます。

Stack 特性:

  • 后进先出:最後にスタックにプッシュされた要素が最初にポップされます。
  • 动态大小:スタックの容量は必要に応じて動的に調整されます。
  • 泛型支持:通过Stack<T>型安全性を提供し、型変換エラーを回避します。
  • 非线程安全:默认StackとStack<T>いずれもスレッドセーフではありません。

Stack クラスのメソッドとプロパティ

以下の表に一覧を示しますStackクラスのいくつかの一般的な属性:

属性名称类型描述
Countintスタック内の要素数を取得します。
SyncRootobjectスタックへのアクセスを同期するためのオブジェクトを取得します(非ジェネリック)。
IsSynchronizedboolスタックへのアクセスが同期されているかどうかを示します(スレッドセーフ、常にfalse)。
td>Stack に含まれる要素の数を取得します。

以下の表に一覧を示しますStackクラスのいくつかの一般的な方法:

方法名称返回类型描述
元素操作
Push(object item)void要素をスタックの先頭にプッシュします。
Pop()objectスタックの先頭の要素を削除して返します。
Peek()objectスタックの先頭の要素を削除せずに返します。
Clear()voidスタック内のすべての要素を削除します。
検査とコピー
Contains(object item)boolある要素がスタック内に存在するかどうかを判断します。
ToArray()object[]スタック内の要素を新しい配列にコピーします(順序は逆になります)。
Clone()object現在のスタックのシャローコピーを作成します。
CopyTo(Array array, int index)voidスタック内の要素を既存の配列に、指定したインデックスからコピーします。
枚举器支持
GetEnumerator()IEnumeratorスタック内の要素を反復処理するための列挙子を返します。
线程安全
Synchronized(Stack stack)Stackスレッドセーフなスタックラッパーを返します。

实例

以下の例は、スタック(Stack)の使用法を示しています。

非ジェネリックスタック:

实例

using System;
using System.Collections;

namespace CollectionsApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            Stack st = new Stack();

            st.Push('A');
            st.Push('M');
            st.Push('G');
            st.Push('W');
           
            Console.WriteLine("Current stack: ");
            foreach (char c in st)
            {
                Console.Write(c + " ");
            }
            Console.WriteLine();
           
            st.Push('V');
            st.Push('H');
            Console.WriteLine("The next poppable value in stack: {0}",
            st.Peek());
            Console.WriteLine("Current stack: ");          
            foreach (char c in st)
            {
               Console.Write(c + " ");
            }
            Console.WriteLine();

            Console.WriteLine("Removing values ");
            st.Pop();
            st.Pop();
            st.Pop();
           
            Console.WriteLine("Current stack: ");
            foreach (char c in st)
            {
               Console.Write(c + " ");
            }
        }
    }
}

上記のコードがコンパイルおよび実行されると、次の結果が生成されます:

Current stack: 
W G M A
The next poppable value in stack: H
Current stack: 
H V W G M A
Removing values
Current stack: 
G M A

泛型堆栈:

实例

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Stack<int> stack = new Stack<int>();

        // 压栈
        stack.Push(10);
        stack.Push(20);
        stack.Push(30);

        // 查看堆栈顶部
        Console.WriteLine($"Peek: {stack.Peek()}"); // 输出:30

        // 弹栈
        Console.WriteLine($"Pop: {stack.Pop()}"); // 输出:30

        // 剩余堆栈
        Console.WriteLine("Remaining items:");
        foreach (var item in stack)
        {
            Console.WriteLine(item); // 输出:20, 10
        }
    }
}

Stack と Stack<T> の違い

Stack(非ジェネリック)

  • 格納オブジェクトはobject类型。
  • 使用時には明示的な型変換が必要で、実行時例外が発生する可能性があります。

Stack<T>(泛型)

  • 型安全性を提供し、型変換の問題を回避します。
  • ボックス化とボックス化解除のオーバーヘッドを回避するため、パフォーマンスが優れています。

C# 集合

其他扩展