【第四回】C#におけるCollectionsの基本のキを理解する【Stack<​T>クラスを利用する】

はい第四回です。
第三回目はこちらです。
今回は実際にC#のプログラミングでスタックを使ってみたいと思います。
ただし例のごとく、僕のプログラミング歴は約3ヶ月と短いので、間違っている可能性山のごとしです。
その点だけご留意ください。

Stack<​T>クラスを利用する

C#でスタックを利用する場合、一般的にはStack<​T>クラスを使うでしょう。
詳細はStack<​T> Classを参照してください。

さて、C#におけるStack<​T>とは一体なんでしょう。
ずばり書かれてあるので、引用します。
原文:

Stack<T> is implemented as an array.

翻訳:

Stack<​T>は配列として実装されています。

はい、そうなんですね。
前回の記事でも書いた通り、スタックとは要は配列なんです。
さらに重要なことが、その後にも書かれているので引用しておきます。

原文:

Stacks and queues are useful when you need temporary storage for information; that is, when you might want to discard an element after retrieving its value.

翻訳:

スタックとキューは、情報を一時的に保存する必要があるときに便利です。つまり、保存されている要素の値を引き出したあと、その要素を破棄したい場合に便利なのです。

これぞスタックやキューの真骨頂という感じの説明ですね。
シンプルにまとめられていて、非常にわかりやすいです。

ではここからは、具体的なStack<​T>クラスの使い方を見ていきましょう。

スタックの主な使い方は3つ

またまた引用しておきます。

原文:

Three main operations can be performed on a System.Collections.Generic.Stack<T> and its elements:
Push inserts an element at the top of the Stack.
Pop removes an element from the top of the Stack<T>.
Peek returns an element that is at the top of the Stack<T> but does not remove it from the Stack<T>.

注*なぜか原文ではPushの項目だけStack<T>ではなくStackとなっていますが、たぶんStack<T>への変更し忘れかな? と思います。特に深い意味はなさそうなので、Stack<T>として理解してもらって問題ありません。

翻訳:

System.Collections.Generic名前空間に属するStack<T>とその要素に対し、以下の3つの主要な操作が実行できます。
・Push:スタックの上部(最初に取り出される位置)に、要素を追加します。
・Pop :スタックの上部(最初に取り出される位置)から、要素を取り除きます。
・Peek:スタックの上部(最初に取り出される位置)にある要素を戻り値として返しますが、その要素はスタックから取り除かれません。

Stack<T>にAdd(T)はない

すでにお気づきかもしれませんが、Stack<T>に要素を追加したい場合、Add(T)ではなくPush(T)を使用します
また、スタックの性質上、Remove(T)なども存在しません(途中で消しちゃったらスタックの意味ないですよね)。
ここがList<T>との大きな違いですね。
ただしClear()やContains(T)などは使えます。
どのメソッドが共通で、どのメソッドが固有なのかはStack<​T> Classを参照してください。

注*拡張メソッドの欄にRemove(T)がありましたが、拡張メソッドは「取扱い注意!」みたいな感じで素人お断りのようです。当然のことながら僕もまだ触れたことがありません。

Stack<T>のメソッドを使ってみる

Push(T)とPop()とPeek()さえ覚えていれば、まあ問題はないでしょう。
それぞれの具体的な使い方と言っても、ぶっちゃけList<T>のAdd(T)なんかと変わらないのであまり解説することもないのですが……。
とりあえず説明していきます。

要素を追加する

スタックの上部に要素を追加するには、Push(T)メソッドを使用します。
「上部以外にはどうやって追加するの?」という疑問が湧くかもしれませんが、スタックは「上部に追加するための機構」です

上部以外に追加する必要はありませんし、もし上部以外に追加する必要があるならスタック以外のコレクションを使用すべきです。
具体的なコードも書いておきます。

Stack<string> stack_month = new Stack<string>();
for (int i = 12; i > 0; i–)
{
stack_month.Push(i.ToString() + “月”);
}

これでstack_monthスタックに12月から値が追加されていき、最終的には1月まで追加されます。
デバッグ画面で確かめてみてください。

要素を取り出す

要素を取り出すにはPop()とPeek()があります。
Pop()は取り出した値をスタック上から取り除きますが、Peek()は取り出すだけでスタック上からは消されません
まずはPopの具体例を見ていきましょう。
先ほどのコードに以下のコードを追加してください。

while(stack_month.Count != 0)
{
Console.WriteLine(stack_month.Pop());
}

これでコンソール画面に1月から12月までが順番に表示されます。
また、stack_monthの要素が全て削除されていることも確認してみてください。
このPop()をPeek()に変えた場合、無限ループが発生します。つまり要素が取り除かれないため、「1月」がずっと表示されてしまうのですね。

スタックの説明は終わり

いかがでしたでしょうか。
スタックの基本的な部分を紹介しました。
上記のプログラムで、6月まで要素を取り出したあと、「13月」や「14月」を追加するプログラムを書こうとしてみてください。
とても手間がかかることがわかると思います。
そこで登場するのがキューです。
キューはまた次回に。

フォローする