数据结构之队列(二)

来源:互联网 发布:jquery javascript 编辑:程序博客网 时间:2024/06/05 18:45

        前一篇介绍了一种数组实现的队列,本文将介绍一种链表实现的队列,并进行简单的比较。


一、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。

0 0
原创粉丝点击