スタック コレクションとキュー コレクションの作成
更新 : 2007 年 11 月
ここでは、スタックやキューなどのデータ構造を MFC のリスト クラスで実現する方法について説明します。ここでは CList の派生クラスを使用します。機能を拡張する必要がない場合は、CList をそのまま使用できます。
スタック
標準のリスト コレクションには先頭と末尾があるので、後入れ先出し (LIFO) スタックと同じように動作するリスト コレクションを簡単に派生できます。スタックは、カフェテリアにあるトレーのスタック (積み重ね) に似ています。トレーを追加するときは、スタックの一番上に乗せます。最後に乗せたトレーを最初に使用します。リスト コレクションのメンバ関数 AddHead と RemoveHead は、要素の追加と取り出しをリストの先頭で行います。つまり、最後に追加した要素が最初に取り出されます。
スタック コレクションを作成するには
MFC が提供する既存のリスト クラスから新しいリスト クラスを派生し、スタック操作をサポートするメンバ関数を追加します。
次の例では、要素のプッシュ、ピーク、ポップをスタックの先頭で行うメンバ関数を追加します。
class CTray : public CObject { }; class CStack : public CTypedPtrList< CObList, CTray* > { public: // Add element to top of stack void Push( CTray* newTray ) { AddHead( newTray ); } // Peek at top element of stack CTray* Peek() { return IsEmpty() ? NULL : GetHead(); } // Pop top element off stack CTray* Pop() { return RemoveHead(); } };
この方法では、基になっている CObList クラスが公開されます。スタックに関係するものかどうかにかかわらず、任意の CObList メンバ関数を呼び出すことができます。
キュー
標準のリスト コレクションには先頭と末尾があるので、先入れ先出し (FIFO) キューと同じように動作するリスト コレクションを簡単に派生できます。キューは、カフェテリアで順番を待っている人の行列に似ています。列の先頭の人が、最初にサービスを受けます。新しく到着した人は、列の最後に付いてサービスを待ちます。リスト コレクションのメンバ関数 AddTail と RemoveHead は、リストの末尾に要素を追加し、リストの先頭から要素を取り出します。つまり、最後に追加した要素は最後に取り出されます。
キュー コレクションを作成するには
MFC が提供する定義済みのリスト クラスから新しいリスト クラスを派生し、キュー操作をサポートするメンバ関数を追加します。
次の例では、キューの最後に要素を登録するメンバ関数と、キューの先頭から要素を取り出すメンバ関数を追加しています。
class CQueue : public CTypedPtrList< CObList, CPerson* > { public: // Go to the end of the line void AddToEnd( CPerson* newPerson ) { AddTail( newPerson ); } // End of the queue // Get first element in line CPerson* GetFromFront() { return IsEmpty() ? NULL : RemoveHead(); } };