本文介绍如何从 MFC 列表类创建其他数据结构,例如 堆栈 和 队列。 这些示例使用派生自 CList的类,但你可以直接使用 CList ,除非需要添加功能。
堆栈
由于标准列表集合同时具有头和尾,因此可以轻松创建一个派生列表集合,该集合模仿后进先出栈的行为。 堆栈就像自助餐厅中的一堆盘子。 新添的盘子将会放在现有的盘子的上面。 最后添加的盘子将会首先被取用。 列表集合成员函数 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 成员函数,无论它对堆栈是否有意义。
队列
由于标准列表集合同时具有头和尾,因此也很容易创建一个模拟先出队列行为的派生列表集合。 队列就像自助餐厅里的一队人。 第一个排队的人是第一个得到服务的人。 随着更多人的来到,他们会排在队伍的末尾等待轮到他们。 列表集合成员函数 AddTail , RemoveHead 可用于从列表的头或尾部添加和删除元素;因此,最近添加的元素始终是最后一个要删除的元素。
创建队列集合
从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(); } };