アルゴリズム講義メモ

講義メモ

・リスト、スタック、キュー

コレクションクラス

・C#などのオブジェクト指向言語が提供する仕掛けで、構造体と同様にデータ構造を提供するクラス
・リスト、スタック、キューなどがある

ジェネリクス

・リスト、スタック、キューのようなデータ構造を提供するコレクションクラスに対して「何を格納するのか」を指定できる仕組み
・これにより、1つのコレクションクラスでどんなデータ型にも対応できる
・無論、構造体オブジェクトを格納するコレクションクラスも作れる

リスト

・https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.generic.list-1
・C#ではList<T>クラスとして提供されており、Tはジェネリクスで格納したいデータの型を指定する
・整数用のリストオブジェクトの生成書式例: List<string> mylist = new List<string>();
・リストへの格納は「リスト名.Add(要素)」で行う
 例: mylist.Add("Veldra");
・リストの内容の表示はforeachが使える
 例: foreach (var w in mylist) { Console.WriteLine(w); } //リストの全件を表示
・リストからの削除は「リスト名.Remove(要素)」で行う
・リストのn番目は配列と同様に「リスト名[先頭を0とする番号]」で得られる。

演習 ex111301.cs

・monstersというstring型のリストを生成せよ
・要素として"Veldra"、"Rimuru"、"Hakuo"を追加
・リストの全要素を表示
・要素から"Rimuru"を削除
・リストの0件目と1件目を表示

作成例

List<string> monsters = new List<string>(); //string型のリストを生成
monsters.Add("Veldra"); //リストに要素を追加(要素[0]になる)
monsters.Add("Rimuru"); //リストに要素を追加(要素[1]になる)
monsters.Add("Hakuo");  //リストに要素を追加(要素[2]になる)
foreach (var w in monsters) { //リストの全要素について
    Console.WriteLine(w); //表示
}
monsters.Remove("Rimuru"); //リストの要素[1]を削除すると前に詰まるので
Console.WriteLine("monsters[0] = {0}", monsters[0]); //要素[0]はそのまま
Console.WriteLine("monsters[1] = {0}", monsters[1]); //要素[2]が要素[1]になっている

キュー

・https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.queue
・待ち行列ともいうデータを溜め込むデータ構造
・先に入れた要素から順番に取り出せるので、FIFO=先入先出構造。
・C#ではQueue<T>クラスとして提供されており、Tはジェネリクスで格納したいデータの型を指定する。
・文字列用のキューオブジェクトの生成書式例: Queue<string> myQue = new Queue<string>();
・キューの末尾への追加は「キュー名.Enqueue(要素)」で行う
 例: myQue.Enqueue("Veldra");
・リストの内容の表示はforeachが使える
 例: foreach (var w in myQue) { Console.WriteLine(w); } //キューの全件を表示
・キューの先頭からの取出しは「キュー名.Dequeue()」で行う。戻り値は取り出した要素
・キューの先頭要素を知りたいときは「キュー名.Peek()」で得られる。
・なお、キューに格納されている要素数は「キュー名.Count」で得られる。

演習 ex111302.cs

・monsterqというstring型のキューを生成せよ
・要素として"Veldra"、"Rimuru"、"Hakuo"を順に末尾に追加
・キューの全要素を表示
・先頭要素を取り出して表示
・キューの件数と、現在の先頭要素を表示

作成例

Queue<string> monsterq = new Queue<string>();
monsterq.Enqueue("Veldra"); //キューの末尾に追加(1件目になる)
monsterq.Enqueue("Rimuru"); //キューの末尾に追加(2件目になる)
monsterq.Enqueue("Hakuo");  //キューの末尾に追加(3件目になる)
foreach (var w in monsterq) { //キューの全要素について
    Console.WriteLine(w); //表示
}
string s = monsterq.Dequeue(); //キューの先頭から取り出す(キューから取り除かれる)
Console.WriteLine("{0}を取り出した!", s); //取り出した要素を表示
Console.WriteLine("キューの格納数は{0}", monsterq.Count); //取出し後の格納数を表示(2)
Console.WriteLine("現在の先頭は{0}", monsterq.Peek()); //専用要素を(取り出さずに)表示

スタック

・https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.generic.stack-1
・データを溜め込んで順序を変えられるデータ構造
・最後に入れた要素から取り出せるので、LIFO=後入先出構造。
・C#ではStack<T>クラスとして提供されており、Tはジェネリクスで格納したいデータの型を指定する。
・文字列用のスタックオブジェクトの生成書式例: Stack<string> myStack = new Stack<string>();
・スタックへの押し込みは「スタック名.Push(要素)」で行う
 例: myStack.Push("Veldra");
・スタックの内容の表示はforeachが使える
 例: foreach (var w in myStack) { Console.WriteLine(w); } //スタックの全件を表示
・スタックの一番上からの飛び出しは「スタック名.Pop()」で行う。戻り値は飛び出した要素
・スタックの一番上の要素を知りたいときは「スタック名.Peek()」で得られる。
・なお、スタックに格納されている要素数は「スタック名.Count」で得られる。

演習 ex111303.cs

・monsterkというstring型のスタックを生成せよ
・要素として"Veldra"、"Rimuru"、"Hakuo"を順に押し込む
・スタックの全要素を表示
・先頭要素を飛び出しさせて表示
・スタックの件数と、現在の先頭要素を表示

作成例

Stack<string> monsterk = new Stack<string>();
monsterk.Push("Veldra"); //スタックに押し込む(1件目になる)
monsterk.Push("Rimuru"); //スタックに押し込む(1件目になる、2件目はVeldra)
monsterk.Push("Hakuo");  //スタックに押し込む(1件目になる、2件目はRimuru、3件目はVeldra)
foreach (var w in monsterk) { //スタックの全要素について
    Console.WriteLine(w); //表示
}
string s = monsterk.Pop(); //スタックの一番上から飛び出す(スタックから取り除かれる)
Console.WriteLine("{0}を取り出した!", s); //飛び出した要素を表示
Console.WriteLine("スタックの格納数は{0}", monsterk.Count); //取出し後の格納数を表示(2)
Console.WriteLine("現在の一番上は{0}", monsterk.Peek()); //専用要素を(取り出さずに)表示

演習 ex111304.cs

・要素数5の文字列配列を作り、スタックを用いて要素順序を反転しよう

作成例

string[] monsters = {"Veldra", "Rimuru", "Hakuo", "Benimaru", "Shuna"};
Stack<string> monsterk = new Stack<string>();
foreach (var w in monsters) { //文字列配列の全要素について
    monsterk.Push(w); //スタックに押し込む
}
for(int i = 0; i < monsters.Length; i++) {
    monsters[i] = monsterk.Pop(); //スタックの一番上から飛び出して配列へ
}
foreach (var w in monsters) { //文字列配列の全要素について
    Console.WriteLine(w); //表示
}

演習 ex111305.cs

・先週作ったMonster構造体のオブジェクトをmonstermスタックに格納し、格納状態を表示しよう

struct Monster { //魔物を示す構造体
    public int hp; //HP
    public int mp; //MP
    public string name; //名前
    public Monster(int h, int m, string n) { //コンストラクタ①
        hp = h; mp = m; name = n; //メンバの値に引数を代入
    }
    public Monster(int h, int m) { //コンストラクタ②
        hp = h; mp = m; name = "名無し"; //メンバの値に引数や文字列を代入
    }
    public Monster(string n) { //コンストラクタ
        hp = 0; mp = 0; name = n; //メンバの値に数値や引数を代入
    }
    public override string ToString() { //【追加】メソッド
        return "HP = " + hp + " MP = " + mp + " 名前 = " + name; //メンバの値の文字列
    }
};

提出:演習 ex111305.cs

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です