创建堆栈和队列集合

本文介绍如何从 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基础类库提供的预定义列表类之一派生新的列表类,并添加更多成员函数以支持队列作的语义。

    以下示例演示如何追加成员函数,将元素添加到队列末尾并从队列的前面获取元素。

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

另请参阅

收藏