【C#】Stackクラスの使い方まとめ!主なプロパティ・メソッドとサンプルコード
Stackクラスとは
C#のStackクラスは、後入れ先出し(LIFO:Last-In-First-Out)の仕組みでオブジェクトを管理するコレクションです。最後に追加した要素が最初に取り出されるという特性を持つため、操作履歴の管理や「元に戻す」機能など、さまざまな場面で活用されています。
なお、System.Collections名前空間には非ジェネリック版のStackが、System.Collections.Generic名前空間には型安全なジェネリック版のStack<T>が用意されており、本記事のサンプルではジェネリック版を使用します。
Stackクラスの主なプロパティ
| 番号 | プロパティ | 説明 |
|---|---|---|
| 1 | Count | Stackに格納されている要素の数を取得します。 |
| 2 | IsSynchronized | Stackへのアクセスが同期されている(スレッドセーフである)かどうかを示す値を取得します。 |
| 3 | SyncRoot | Stackへのアクセスを同期するために使用できるオブジェクトを取得します。 |
Stackクラスの主なメソッド
| 番号 | メソッド | 説明 |
|---|---|---|
| 1 | Clear() | Stackからすべてのオブジェクトを削除します。 |
| 2 | Clone() | Stackの簡易コピー(シャローコピー)を作成します。 |
| 3 | Contains(Object) | 指定した要素がStack内に存在するかどうかを判定します。 |
| 4 | CopyTo(Array, Int32) | 指定した配列インデックスを開始位置として、Stackを既存の1次元配列へコピーします。 |
| 5 | Equals(Object) | 指定したオブジェクトが現在のオブジェクトと等しいかどうかを判断します。 |
| 6 | GetEnumerator() | Stackを反復処理するためのIEnumeratorを返します。 |
| 7 | GetHashCode() | 既定のハッシュ関数として機能します(Objectから継承)。 |
| 8 | GetType() | 現在のインスタンスのTypeを取得します。 |
| 9 | Peek() | Stackの先頭にあるオブジェクトを、削除せずに返します。 |
| 10 | Pop() | Stackの先頭にあるオブジェクトを削除して返します。 |
| 11 | Push(Object) | Stackの先頭にオブジェクトを挿入します。 |
サンプルコード①:Peek()で先頭要素を取得する
スタックの先頭にある要素を削除せずに参照したい場合は、Peek()メソッドを使用します。以下の例では、文字列"A"~"J"を順にPushし、要素数と先頭の要素を表示しています。
using System;
using System.Collections.Generic;
public class Demo {
public static void Main() {
Stack<string> stack = new Stack<string>();
stack.Push("A");
stack.Push("B");
stack.Push("C");
stack.Push("D");
stack.Push("E");
stack.Push("F");
stack.Push("G");
stack.Push("H");
stack.Push("I");
stack.Push("J");
Console.WriteLine("要素数 = " + stack.Count);
Console.WriteLine("スタックの先頭要素 = " + stack.Peek());
}
}
実行結果
要素数 = 10 スタックの先頭要素 = J
最後にPushした"J"がスタックの先頭(トップ)になっていることが確認できます。
サンプルコード②:Contains()で要素の存在を確認する
スタックに特定の要素が含まれているかどうかを調べるには、Contains()メソッドを使用します。以下の例では、整数値を10個Pushした後、foreach文で全要素を表示し、Contains(400)の結果を出力しています。
using System;
using System.Collections.Generic;
public class Demo {
public static void Main() {
Stack<int> stack = new Stack<int>();
stack.Push(100);
stack.Push(150);
stack.Push(175);
stack.Push(200);
stack.Push(225);
stack.Push(250);
stack.Push(300);
stack.Push(400);
stack.Push(450);
stack.Push(500);
Console.WriteLine("スタックの要素:");
foreach (var val in stack) {
Console.WriteLine(val);
}
Console.WriteLine("スタックの要素数 = " + stack.Count);
Console.WriteLine("スタックに400は含まれるか? = " + stack.Contains(400));
}
}
実行結果
スタックの要素: 500 450 400 300 250 225 200 175 150 100 スタックの要素数 = 10 スタックに400は含まれるか? = True
LIFO構造の特性上、出力は最後に追加した500から順に表示されます。また、400はスタックに存在するため、Contains(400)はTrueを返します。
-
C#でPushとPop操作を使ってスタックを実装する方法
スタック(Stack)は「後入れ先出し(LIFO:Last In First Out)」と呼ばれるデータ構造で、最後に追加した要素が最初に取り出される仕組みです。C#では System.Collections 名前空間の Stack クラスを使うことで、簡単にスタックを扱うことができます。 Push操作でスタックに要素を追加する Push() メソッドを使用すると、スタックの一番上に新しい要素を追加できます。以下は、文字を4つスタックに追加する例です。 Stack st = new Stack(); st.Push(A); st.Push(M); st.Push(G); st.Push(W)
-
Pythonでスタックを実装する3つの方法を具体例つきで解説
スタック(Stack)は、LIFO(Last In First Out:後入れ先出し)という仕組みで動作する線形データ構造です。最初にスタックへ格納された要素は、最後に取り出されるという特徴を持ちます。身近な例で理解するスタックスタックの仕組みは、「積み重ねた皿」をイメージすると分かりやすくなります。皿は1枚ずつ上に重ねていきます。最初に置いた皿は山の一番下にあり、最後に置いた皿が一番上にきます。皿が必要になったとき、私たちは必ず一番上の皿、つまり最後に置かれた皿から取ります。逆に、最初に置かれた皿が一番下に残り、最後に取り出されることになります。これこそが「後入れ先出し(LIFO)」の仕組み