Stackて何?どうやって使うの?
Stack(スタック)とは、C# で扱えるコレクションの1つで、最後に追加された要素から処理するためのコレクションです。
このコレクションを使うと、最後に追加された要素が最初に取り出され、後から追加された要素から順番に取り出されます。これは「後入れ先出し(Last-In-First-Out=LIFO)」の原則に基づいています。
この記事では、C# のコレクションの1つである Stack の特徴と基本的な使用方法をサンプルコードを交えて紹介をしています。
ぜひ参考にしてみてください。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
Stackとは?
Stack(スタック)とは、C# で扱えるコレクションの1つで、再度に追加された要素が最初に取り出して処理するコレクションです。
C# では、System.Collections.Generic
名前空間にStack<T>
クラスが定義されています。ジェネリック型<T>
を使用することで、任意の型のオブジェクトをキューに格納できるため、柔軟に扱うことができます。
このコレクションを使うと、最後に追加された要素が最初に取り出され、後から追加された要素は順番がきたら取り出されます。これは「後入れ先出し(Last-In-First-Out=LIFO)」の原則に基づいています。
新しい要素はコレクションの先頭に追加されます。新しいデータを先に処理したい時や処理待ちのデータを一時的に蓄えておくのに適したコレクションです。
先入れ先出しをしたい場合はQueue
クラスを使います。使い方は次の記事を参考にしてください。
Stackの使い方
ここから Stack<T> の使い方について紹介をします。
C# では Stack を扱うためのメソッドがいくつか用意されています。よく使用するメソッドは以下の通りです。
- Pushメソッド
Stack(スタック)の先頭にデータを追加します。 - Popメソッド
Stack(スタック)の先頭からデータを取り出します。 - Peekメソッド
Stack(スタック)の先頭のデータを読み取ります。(要素は取り出りしません)
要素を先頭に追加する(Push)
Stack に新しい要素を追加するには、Push
メソッドを使用します。
このメソッドは、Stack の先頭に新しい要素を追加します。Push
メソッドの引数に追加したい要素を渡します。
要素を追加する時、Stack に空きが無かった場合は自動で Stack のサイズが拡張されます。
次のサンプルコードは 1 ~ 7 までの整数をスタックに追加し、その後、スタックの要素をコンソールに表示します。
// 整数を格納するスタック
var stack = new Stack<int>();
// スタックに1から7まで順に投入
for (int i = 1; i < 8; i++)
{
stack.Push(i);
}
// スタックの要素を表示
foreach (int s in stack)
{
Console.WriteLine(s);
}
実行結果は次の通りです。
7
6
5
4
3
2
1
上記のサンプルコードではStack<T>
クラスのインスタンスを生成し、for
文でループさせながらPush
メソッドで要素をStack(スタック)に追加します。
Stack(スタック)は LIFO の原理に従うため、最後に追加された要素である 7 が最初に表示されます。
先頭の要素を取り出す(Pop)
Stack から要素を取り出すには、Pop
メソッドを使用します。
このメソッドは、Stack の先頭にある要素、つまり最後に追加された要素を取り出します。要素を取り出すので、その要素は Stack から削除され、残りのデータは先頭に向かって1つずつ移動します。
次のサンプルコードは 1 ~ 7 までの整数をスタックに追加し、その後、Pop
メソッドで先頭の要素を取り出します。
// 整数を格納するスタック
var stack = new Stack<int>();
// スタックに1から7まで順に投入
for (int i = 1; i < 8; i++)
{
stack.Push(i);
}
// スタックの要素を取り出し
var item = stack.Pop();
Console.WriteLine($"取り出した要素:{item}");
// スタックの要素を表示
foreach (int s in stack)
{
Console.WriteLine(s);
}
実行結果は次の通りです。
取り出した要素:7
6
5
4
3
2
1
上記のサンプルコードではPop
メソッドで Stack の要素を取り出しています。foreach
文で Stack の要素を確認すると、取り出した要素が含まれていないことが分かります。
要素を取得する(Peek)
Stack から要素を削除せずに取得するには、Peek
メソッドを使用します。
このメソッドは、Stack の先頭にある要素を取得します。どの要素が次に取り出されるかを確認する際に便利なメソッドです。
Pop
メソッドと違う点は Stack の要素を削除しない点です。
次のサンプルコードは 1 ~ 7 までの整数をスタックに追加し、その後、Peek
メソッドで最初に追加した要素を取得します。
// 整数を格納するスタック
var stack = new Stack<int>();
// スタックに1から7まで順に投入
for (int i = 1; i < 8; i++)
{
stack.Push(i);
}
// 次取り出すことができる要素を取得する
var item = stack.Peek();
Console.WriteLine($"次に取り出す要素:{item}");
// スタックの要素を表示
foreach (int s in stack)
{
Console.WriteLine(s);
}
実行結果は次の通りです。
次に取り出す要素:7
7
6
5
4
3
2
1
上記のサンプルコードではPeek
メソッドを呼び出して、Stack の先頭にある要素を取得しています。
Peek
メソッドは Stack から要素を削除しないので、foreach
文で Stack の要素を確認すると、取得した要素が含まれていることが分かります。
要素を全て削除する(Clear)
Stack から要素を全て削除するには、Clear
メソッドを使用します。
このメソッドは、Stack の中にある要素を全て削除するので、要素の数は 0 になります。
次のサンプルコードは 1 ~ 7 までの整数をスタックに追加し、その後、Clear
メソッドで要素を削除します。
// 整数を格納するスタック
var stack = new Stack<int>();
// スタックに1から7まで順に投入
for (int i = 1; i < 8; i++)
{
stack.Push(i);
}
Console.WriteLine($"Clearメソッドを使う前の要素:{stack.Count}");
// スタックの要素をすべて削除
stack.Clear();
Console.WriteLine($"Clearメソッドを使う後の要素:{stack.Count}");
実行結果は次の通りです。
Clearメソッドを使う前の要素:7
Clearメソッドを使う後の要素:0
Stack の要素数を確認するにはCount
メソッドを使います。
上記のサンプルコードではClear
メソッドを呼び出す前後で要素数がどのように変化しているかを確認しています。実行結果から分かるようにClear
メソッドを使用すると要素数が0になっています。
Clear
メソッドは Stack を再利用するために中身を全て破棄したい場合や、プログラムの特定の処理段階で Stack をリセットしたい場合に特に役立ちます。
まとめ
この記事では、C# で利用できるコレクションの1つである Stack の使い方について紹介しました。
最初に追加された要素が最初に取り出され、後から追加された要素は順番がきたら取り出される「後入れ先出し(Last-In-First-Out=LIFO)」の原則に基づいているコレクションです。
- Pushメソッド
Stack(スタック)の先頭にデータを追加します。 - Popメソッド
Stack(スタック)の先頭からデータを取り出します。 - Peekメソッド
Stack(スタック)の先頭のデータを読み取ります。(要素は取り出りしません)
Stack はデータを順番に処理する必要がある多くの場面で活躍できます。その際はぜひこの記事を参考にしてみてください。
以上、最後まで読んで頂きありがとうございました。