この記事では、MFC リスト クラスからスタックやキューなどの他 の データ構造 を作成する方法について説明します。 この例では、 CList
から派生したクラスを使用しますが、機能を追加する必要がない限り、 CList
を直接使用できます。
スタック
標準リスト コレクションには頭と末尾の両方があるため、最後の最初のスタックの動作を模倣する派生リスト コレクションを簡単に作成できます。 積み重ねはカフェテリアのトレイの積み重ねのようなものです。 トレイはスタックに追加されると、スタックの上に移動します。 最後に追加されたトレイは、取り外す最初のトレイです。 リスト コレクションメンバー関数 AddHead
および RemoveHead
を使用して、リストの先頭から特に要素を追加および削除できます。したがって、最後に追加された要素が最初に削除されます。
スタック コレクションを作成するには
既存の MFC リスト クラスの 1 つから新しいリスト クラスを派生させ、スタック操作の機能をサポートするメンバー関数を追加します。
次の例は、メンバー関数を追加して、要素をスタックにプッシュし、スタックの最上位要素を確認し、スタックから最上位の要素を取り出す方法を示しています。
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
メンバー関数を呼び出すことができます。
待ち行列
標準リスト コレクションには頭と末尾の両方があるため、先入れ先出しキューの動作を模倣する派生リスト コレクションを簡単に作成することもできます。 待ち行列はカフェテリアの人の列のようなものです。 最初の列のユーザーが最初にサービスを提供されます。 来た人たちは列の最後に並んで順番を待ちます。 リスト コレクションメンバー関数 AddTail
および RemoveHead
を使用して、リストの先頭または末尾から要素を追加および削除できます。したがって、最後に追加された要素は常に最後に削除されます。
キュー コレクションを作成するには
Microsoft Foundation クラス ライブラリで提供されている定義済みのリスト クラスの 1 つから新しいリスト クラスを派生させ、キュー操作のセマンティクスをサポートするメンバー関数を追加します。
次の例は、メンバー関数を追加して、キューの末尾に要素を追加し、キューの先頭から要素を取得する方法を示しています。
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(); } };