次の方法で共有


スタック コレクションとキュー コレクションの作成

Microsoft Foundation Classes (MFC) ライブラリは引き続きサポートされています。 ただし、機能の追加やドキュメントの更新は行われません。

この記事では、MFC リスト クラスからスタックやキューなどの他 データ構造 を作成する方法について説明します。 この例では、 CListから派生したクラスを使用しますが、機能を追加する必要がない限り、 CList を直接使用できます。

スタック

標準リスト コレクションには頭と末尾の両方があるため、最後の最初のスタックの動作を模倣する派生リスト コレクションを簡単に作成できます。 積み重ねはカフェテリアのトレイの積み重ねのようなものです。 トレイはスタックに追加されると、スタックの上に移動します。 最後に追加されたトレイは、取り外す最初のトレイです。 リスト コレクションメンバー関数 AddHead および RemoveHead を使用して、リストの先頭から特に要素を追加および削除できます。したがって、最後に追加された要素が最初に削除されます。

スタック コレクションを作成するには

  1. 既存の 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 を使用して、リストの先頭または末尾から要素を追加および削除できます。したがって、最後に追加された要素は常に最後に削除されます。

キュー コレクションを作成するには

  1. 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();
       }
    };
    

こちらも参照ください

コレクション