您的位置:首页 > 理论基础 > 数据结构算法

数据结构之队列(二)

2016-02-22 10:16 941 查看
前一篇介绍了一种数组实现的队列,本文将介绍一种链表实现的队列,并进行简单的比较。

一、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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: