前一篇介绍了一种数组实现的队列,本文将介绍一种链表实现的队列,并进行简单的比较。
一、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。