数据结构之队列(二)
2016-02-22 10:16
941 查看
前一篇介绍了一种数组实现的队列,本文将介绍一种链表实现的队列,并进行简单的比较。
一、QueueAsLinkedList(点击打开链接)
先看声明,链表实现的队列没有特定的成员,只有一个链表,如下:
实现代码,如下:
二、比较
1,链表实现比数组实现的成员变量少;
2,链表实现在物理上是离散的,无需管理物理上的头和尾,比数组实现的代码简单;
3,链表实现和物理实现在逻辑上都是连续的;
4,链表实现没有size限制,数组实现可以限定size。
一、QueueAsLinkedList(点击打开链接)
先看声明,链表实现的队列没有特定的成员,只有一个链表,如下:
#pragma once #include "Queue.h" #include "LinkedList.h" using namespace FoundationalDataStructure; class QueueAsLinkedList : public virtual Queue { public: QueueAsLinkedList(); ~QueueAsLinkedList(); void Purge(); void Accept(Visitor &) const; Object & Head() const; void Enqueue(Object &); Object & Dequeue(); protected: int CompareTo(Object const &) const; protected: LinkedList<Object*> list; };
实现代码,如下:
#include "stdafx.h" #include "QueueAsLinkedList.h" QueueAsLinkedList::QueueAsLinkedList() : list() { } QueueAsLinkedList::~QueueAsLinkedList() { Purge(); } void QueueAsLinkedList::Purge() { if (IsOwner()) { for (auto ptr = list.Head(); ptr != NULL; ptr = ptr->Next()) delete ptr->Datum(); } list.Purge(); count = 0; } void QueueAsLinkedList::Accept(Visitor & visitor) const { for (auto ptr = list.Head(); ptr != NULL && !visitor.IsDone(); ptr = ptr->Next()) visitor.Visit(*ptr->Datum()); } Object & QueueAsLinkedList::Head() const { if (count == 0) throw std::domain_error("queue is empty"); return *list.First(); } void QueueAsLinkedList::Enqueue(Object & object) { list.Append(&object); ++count; } Object & QueueAsLinkedList::Dequeue() { if (count == 0) throw std::domain_error("queue is empty"); Object &result = *list.First(); list.Extract(&result); --count; return result; } int QueueAsLinkedList::CompareTo(Object const & object) const { return -1; }
二、比较
1,链表实现比数组实现的成员变量少;
2,链表实现在物理上是离散的,无需管理物理上的头和尾,比数组实现的代码简单;
3,链表实现和物理实现在逻辑上都是连续的;
4,链表实现没有size限制,数组实现可以限定size。