C#ライブラリリファレンス - スタックを使って後入れ先出し法でデータを管理する
スタックジェネリックオブジェクトを使用すれば、複数のインスタンス(データ)を後入れ先出し法で格納管理できます。
日常でたとえると
入社して間もない人から順番に社員研修を受けてもらう。
使用に適した状況
インスタンス(データ)の格納する順番に重要な意味がある場合。後入れ先出し法は、文字列解析などに使用します。また、昔は会計システムでも後入れ先出し法が重宝されていました。
サンプル
/*----------------------------------------------------
*
* スタックにより後入れ先出しでデータを管理。
*
----------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
class Sample
{
static void Main( )
{
//スタックを用意
var datas = new Stack<int>();
//スタックにデータを追加
Console.WriteLine(
"***** スタックにデータを入れます *****" );
Action<int> Add = ( int value ) => {
datas.Push( value );
Console.Write( " 追加した数:{0}",
value );
};
ProcessPrint(
datas,
Add );
//スタックからデータを取り出す
Console.WriteLine(
"***** スタックからデータを取り出します *****" );
Action<int> Get = ( int i ) => {
int value = datas.Pop();
Console.Write( " 取り出した数:{0}",
value );
};
ProcessPrint(
datas,
Get );
//終了
Console.ReadLine();
}
//追加または取り出すときの様子を表示する。
private static void ProcessPrint(
Stack<int> datas, Action<int> process )
{
for ( int i = 0 ; i < 10 ; ++i ) {
Console.Write( "処理前の個数:{0}",
datas.Count );
//空の時Peekを呼び出すと例外が発生
Console.Write( " 先頭の数:{0}",
datas.Count != 0 ?
datas.Peek().ToString() :
"0" );
process( i );
Console.Write( " 処理後の個数:{0}",
datas.Count );
Console.WriteLine();
}
Console.WriteLine();
}
}
名前空間
System.Collections.Generic名前空間を参照します。LINQプログラミングのために、System.Linq名前空間も参照しましょう。
解説
プログラミングでは、データ(オブジェクトのインスタンス)をただ集めればいいというものではなく、格納した順番が重要な意味を持つ場合があります。リストジェネリックオブジェクトでもデータを格納できますが、誰かが整列してしまうかもしれませんし、プログラマに対して入れた順番の逆順(後に入れたものを先に出す)に、取り出すのが重要であることを明示しなくてはなりません。
データを入れた順番とは逆に取り出して処理をしたい場合、Stackジェネリックオブジェクトを使用します。このオブジェクトは、Push(プッシュ)メソッドでデータを入れ、Pop(ポップ)メソッドで後入れ先出し法にてデータを取り出します。
取り出したデータは消えてしまうので、先頭のデータを調べたい時は、Peekメソッドでスタックの中を覗きます。ただし、空の時に覗くと怒られる(例外が発生する)ので注意しましょう。
後入れ先出し法の使い道がわからない人がいるのでちょっとだけ解説します。コンパイラのアルゴリズムで、後入れ先出し法を使います。これは、文字列を解析し、意味を割り出すために行います。コンパイラのアルゴリズムを知らない人がいるかもしれないので、現実に例も挙げます。現実の例は原価計算です。
今は会計法規が変わって禁止されましたが、結構使用されていました、というのも、新しい製品の製造に力を入れている会社は、月初仕掛品換算量よりも月末仕品換量(材料の量)の方が多いもしくは同じぐらいだからです。もしこの場合に、先入れ先出し法で原価を計算してしまうと、極端にコストが安くなる恐れがあります。何故ならば、材料の物価が上昇している場合、昔の材料の物価が極端に安い場合があり得ます。なので、現実の原価を把握するために後入れ先出し法で計算している会社もありました。
実例でわかるように、思わぬところで使用されています。覚えておくと、発想の幅が広がります。