Stack(スタック)
Stackは、Queueと並んで有名な積み上げ型のデータ構造を元にしたコレクションです。Queueとは違い、先に入れたものが後から出てくる構造をしています。Queueが要素の追加や削除にエンキュー、デックという独特の言い回しを使うのと同様、Stackにデータを入れることをプッシュ(Push)、Stackからデータを取り出すことをポップ(Pop)と呼びます。こちらもデータの記憶領域の管理をコレクションに任せられることと、様々な型のデータをまとめて取り扱うことができるという点が便利なところです。
Stackサンプルプログラムの解説
Stack stk = new Stack();
stk.Push("First Object");
stk.Push(2);
stk.Push(3.1415);
Console.WriteLine("Stack size : {0}", stk.Count);
Console.WriteLine("1st Pop : {0}", stk.Pop());
Console.WriteLine("Stack size : {0}", stk.Count);
Console.WriteLine("2nd Pop : {0}", stk.Pop());
Console.WriteLine("Push.");
stk.Push("新しい値を追加");
Console.WriteLine("Stack size : {0}", stk.Count);
Console.WriteLine("3rd Pop : {0}", stk.Pop());
Stack size : 3 1st Pop : 3.1415 Stack size : 2 2nd Pop : 2 Push. Stack size : 2 3rd Pop : 新しい値を追加
特筆して説明する点はありません。先入れ後出し構造であることとメソッド名の違いをのぞけば、その挙動はQueueとほぼ同じです。
Stackの基本的な使い方
Push(value)で値を追加Pop()で値を取り出す
という、Queueとよく似た使い方をします。Queueと同じく、Peekメソッドを使うことで、Stackに積んであるオブジェクトを削除せずに取り出すことが可能です。特定要素へのアクセス方法が提供されていないこと、null参照をPushできること、Stackの要素が底をついた状態でPopするとInvalidOperationException例外を投げることも、Queueと同じです。
Stackを使う上での注意点
Stack特有の注意点としては、Popメソッドのオーダーにあります。Stackの容量がCountの返す値よりも大きければ、PopはO(1)で動作します。しかし、Countの値がStackの容量よりも大きければ、PopはO(n)で動作します。従って、速度を要求される場面ではあらかじめ十分な大きさのStackを確保した方が良いでしょう。他のコレクション同様、コンストラクタで容量の指定が可能です。
まとめ
今回はSystem.Collections名前空間に属する便利なコレクションについて紹介しました。いずれも便利で活用の幅の広いデータ構造ばかりですから、様々な用途に活用していただきたいと思います。
