数据结构之队列(四)

        本文将学习“双端队列”及其实现,并探讨两种继承路线——“Generalization”和“Specialization”。(点击打开链接)


一、双端队列及其基本操作

        前面几篇文章学习的“Queue”都是在一端添加元素,在另一端删除元素。本文要介绍的“Deque”(Double-end queue,双端队列)是一种可以在“pile”的两端都进行添加和删除操作的数据结构,是“Queue”的加强版。如下图:

数据结构之队列(四)_第1张图片

        “Deque”在其首尾两段都可进行“添加”、“删除”和“访问”三种操作,接口定义如下:

#pragma once
#include "Queue.h"
class Deque : public virtual Queue
{
public:
    virtual Object & Head() const = 0;
    virtual Object & Tail() const = 0;
    virtual void Enqueue(Object&);
    virtual void EnqueueHead(Object&) = 0;
    virtual void EnqueueTail (Object&) = 0;
    virtual Object & Dequeue();
    virtual Object & DequeueHead() = 0;
    virtual Object & DequeueTail() = 0;
};

        为了与基类一致,它实现了“Queue”的接口,如下:

#include "Deque.h"


void Deque::Enqueue(Object& object)
{
    EnqueueTail(object);
}

Object & Deque::Dequeue()
{
    return DequeueHead();
}


二、继承路线

1,泛化(Generalization)

        基类提供简单的(功能)接口,派生类在基类接口的基础上增加新的接口,形成“is-a”关系,这种继承方式就是“Generalization”。比如“Queue”→“Deque”。

2,特化(Specialization)

        基类提供丰富的接口,派生类关闭基类的部分接口,形成基类的特例,这种继承方式就是“Specialization”。比如:“Deque”→“Queue”。

        一般地,我们采用泛化的方式来派生继承体系,但有时候,在基类已经确定的情况下,也可以通过特化的办法逆向进行派生。最终目的就是提高代码复用。在泛型编程中,特化可能更常用。

你可能感兴趣的:(数据结构之队列(四))