スタックの基本
スタックとはデータ構造の1種であり、最初に入れたデータが最後に取り出されるという特徴がある(First In Last Outの略でFILO方式と言うそうです)。
スタックについて詳しく知りたい方はWikiなどを参考にしてください。
ja.wikipedia.org
C#におけるスタックの基本的な使用方法
宣言
Stack<型> 変数名 = new Stack<型>();
というように宣言することで、データを格納するための箱が作られる。
データの追加
スタックの変数名.Push(格納する値);
サンプルコード
スタックは重ねていくようにデータを追加するので、最後に追加した3が一番上にくる。//int型のスタックの設定 Stack<int> stack = new Stack<int>(); //値の格納 stack.Push(1); stack.Push(2); stack.Push(3);
値の取り出し①(Pop)
この方法でデータを取得すると取得したデータはスタックから取り除かれるという特徴がある。
スタックの変数名.Pop();
サンプルコード
入れたのが後のデータから順に取り出されるため、xには3が格納される。//int型のスタックの設定 Stack<int> stack = new Stack<int>(); //値の格納 stack.Push(1); stack.Push(2); stack.Push(3); // 値の取り出し(x = 3) int x = stack.Pop();
値の取り出し②(Peek)
この方法でデータを取得すると取得したデータはスタックから取り除かれないという特徴がある。値を参照するだけならこちらがよい。
スタックの変数名.Peek();
サンプルコード
取り出したデータは除去されないので、実行後もstackには1, 2, 3のデータが入っている。//int型のスタックの設定 Stack<int> stack = new Stack<int>(); //値の格納 stack.Push(1); stack.Push(2); stack.Push(3); // 値の取り出し(x = 3) int x = stack.Pop();
格納している全要素の表示
- foreachを用いることで実現できます。
- 上記のPopなどを繰り返し用いてもよいですが、Popした値は元のstackから消えてしまう点に注意。
foreach (型名 各要素を格納したい変数名 in スタックの変数名){/*処理*/}
サンプルコード
//int型のスタックの設定 Stack<int> stack = new Stack<int>(); //値の格納 stack.Push(1); stack.Push(2); stack.Push(3); // 値を表示 foreach (int element in stack) { Console.Write($"{element}, "); } Console.WriteLine("\n");
実行結果
3, 2, 1,
スタックの大きさの取得
スタックの変数名.Count
サンプルコード
//int型のスタックの設定 Stack<int> stack = new Stack<int>(); //値の格納 stack.Push(1); stack.Push(2); stack.Push(3); // 値を表示 Console.WriteLine($"stack.Count = {stack.Count}");
実行結果
stack.Count = 3
スタックの中身を空にする
スタックの変数名.Clear();
サンプルプログラム
これらを用いたプログラムと実行結果を下に示す。
using System.Collections.Generic; using System; public class StackSample { public static void Main() { //int型のスタックの設定 Stack<int> stack = new Stack<int>(); //値の格納 stack.Push(2); stack.Push(-1); Console.WriteLine($"stackの中身表示"); foreach (int element in stack) { Console.Write($"{element}, "); } Console.WriteLine("\n"); //大きさの取得 Console.WriteLine($"スタックの大きさ:{stack.Count}\n"); //値の取り出し Console.WriteLine($"stack.Pop()で出てくる値:{stack.Pop()}"); Console.WriteLine($"stack.Peek()で出てくる値:{stack.Peek()}"); Console.WriteLine($"stack.Pop()で出てくる値:{stack.Pop()}\n"); //空にする stack.Clear(); //大きさの取得 Console.WriteLine($"stack.Clear()後のスタックの大きさ:{stack.Count}"); } }
実行結果
stackの中身表示 -1, 2, スタックの大きさ:2 stack.Pop()で出てくる値:-1 stack.Peek()で出てくる値:2 stack.Pop()で出てくる値:2 stack.Clear()後のスタックの大きさ:0