ジェネリックなStackクラスを定義してみた。
下記のソースがその実装とテストである。
SE出版、「C#で学ぶオブジェクト指向プログラミング図解でおぼえるデータ構造とアルゴリズム」という書籍を参考にした。
参考書籍はC#1.xで書かれているため、ジェネリックは使用されておらず、ノードはobject扱いとなっている。
そのため、Popする場合はボックス化できないものは型変換を明示しなければならず、扱いにくい。
さらにStackする場合も型のチェックがないのでint stringなどなんでも詰め込めた(自分でチェックすれば良いだけだが・・・・)
という事もあり、自分でジェネリックに書き直そうと思ったのが、このソースコードを書くきっかけである。
ちなみにテストではStack<int?>と宣言した。
Stack<int>と定義してしまうと、永遠にPopで値( = 0)が帰ってくるからだ。
構造体をスタックする場合は注意が必要である。
もっとウマイ方法があるかも知れないが私には分からない(笑)
using System; using System.Text; using System.Collections.Generic; namespace Art { public class Stack<T> { private Node top = null; public class Node { public Node next; public T value; public Node(T value) { this.value = value; } } public bool IsEmpty { get { return top == null ? true : false; } } public void Push(T value) { Node node = new Node(value); if (top != null) { node.next = top; } top = node; } public T Pop() { if (top == null) { return default(T); } else { T obj = top.value; top = top.next; return obj; } } } public class StackTester { [STAThread] public static void Main(string[] args) { Stack<int?> s = new Stack<int?>(); s.Push(1); s.Push(2); s.Push(3); while (!s.IsEmpty) { Console.WriteLine(s.Pop()); } } } } |
<解説>
後日追記予定