数据结构之队列(二)

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值