Создание коллекций стеков и очередей

В этой статье объясняется, как создать другие структуры данных, такие как стеки и очереди, из классов списков MFC. В примерах используются классы, производные от CList, но вы можете использовать CList напрямую, если вам не нужно добавлять функциональные возможности.

Стеки

Так как стандартная коллекция списков имеет как голову, так и хвост, легко создать коллекцию производных списков, которая имитирует поведение стека последнего в первом выходе. Стек похож на стек лотков в кафетерии. Так как области добавляются в стек, они идут поверх стека. Последняя добавленная область — первое, что нужно удалить. Функции-члены AddHeadRemoveHead коллекции списков и могут использоваться для добавления и удаления элементов конкретно из головы списка. Таким образом, последний добавленный элемент является первым для удаления.

Создание коллекции стека

  1. Наследуйте новый класс списка из одного из существующих классов списков 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 функцию-член, имеет смысл для стека или нет.

Очереди

Так как коллекция стандартных списков имеет как голову, так и хвост, также легко создать коллекцию производных списков, которая имитирует поведение очереди первого в первом выходе. Очередь похожа на линию людей в кафетерии. Первый человек в очереди является первым, чтобы быть обслуживаемой. По мере того как больше людей приходят, они идут в конец линии, чтобы дождаться их поворота. Функции-члены AddTailRemoveHead коллекции списков и могут использоваться для добавления и удаления элементов конкретно из головы или хвоста списка. Таким образом, последний добавленный элемент всегда является последним для удаления.

Создание коллекции очередей

  1. Наследуйте новый класс списка от одного из предварительно определенных классов списка, предоставляемых библиотекой классов Microsoft Foundation, и добавьте дополнительные функции-члены для поддержки семантики операций очередей.

    В следующем примере показано, как добавить функции-члены для добавления элемента в конец очереди и получения элемента из передней части очереди.

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

См. также

Коллекции