queue实现

队列是一种先进先出的线性数据结构。分别有对头指针front和队尾指针rear,数据从对头出,从队尾进。队列可以分为顺序队列和链接队列。

  • 顺序队列中,

各逻辑位置相邻的数据其物理位置也相邻,为了节省空间,一般采用循环队列结构

队头指针进1(数据出队列):front=(front+1)%maxSize; //maxSize为顺序队列创造时设置的最大存储空间

队尾指针进1(数据入队列):rear=(rear+1)%maxSize;

注意:

队列为空时,rear=front;

队列为满时,(rear+1)%maxSize=front;

  • 链接队列中,

front指向的第一个队列节点是一个空节点,即是一个带表头的单链表,rear始终指向最后一个节点,即rear->link=NULL

1.队列抽象类

template <class T>
class Queue
{
public:
    virtual bool IsEmpty() const=0;
    //virtual bool IsFull() const=0;
    virtual bool Front(T &x) const=0;   //返回队首元素给x
    virtual bool EnQueue(T x)=0;        //队尾x入队列
    virtual bool DeQueue()=0;           //队首出队列
    virtual bool Clear()=0;
};

2.顺序队列的实现

#include "queue.h"
 
template <class T>
class SeqQueue:public Queue<T>
{
private:
    T *q;           //建立T类型数组,指针q指向数组首地址,作为队列
    int front,rear; //front是队首下标号,rear是队尾下标号
    int maxSize;    //队列长度
public:
    SeqQueue(int mSize);
    ~SeqQueue();
    bool IsEmpty() const;
    bool IsFull() const;
    bool Front(T &x) const; //返回队首元素给x
    bool EnQueue(T x);      //队尾x入队列
    bool DeQueue();         //队首出队列
    bool Clear();
    void Print() const;
};

#include "seqqueue.h"
 
template <class T>
SeqQueue<T>::SeqQueue(int mSize)
{
    maxSize=mSize;
    q=new T[maxSize];
    front=rear=0;
}
 
template <class T>
SeqQueue<T>::~SeqQueue()
{
    delete [] q;
}
 
template <class T>
bool SeqQueue<T>::IsEmpty() const
{
    return front==rear;
}
 
template <class T>
bool SeqQueue<T>::IsFull() const
{
    return (rear+1)%maxSize==front;
}
 
template <class T>
bool SeqQueue<T>::Front(T &x) const
{
    if(IsEmpty())
    {
        cout<<"Front:the seqqueue is empty"<<endl;
        return false;
    }
    x=q[(front+1)%maxSize];
    return true;
}
 
template <class T>
bool SeqQueue<T>::EnQueue(T x)
{
    if(IsFull())
    {
        cout<<"EnQueue:the seqqueue is full"<<endl;
        return false;
    }
    rear=(rear+1)%maxSize;
    q[rear]=x;
    return true;
}
 
template <class T>
bool SeqQueue<T>::DeQueue()
{
    if(IsEmpty())
    {
        cout<<"DeQueue:the seqqueue is empty"<<endl;
        return false;
    }
    front=(front+1)%maxSize;
    return true;
}
 
template <class T>
bool SeqQueue<T>::Clear()
{
    rear=front=0;
    return true;
}
 
template <class T>
void SeqQueue<T>::Print() const
{
    int j=front;
    while(j%maxSize!=rear)
    {
        cout<<q[(j+1)%maxSize]<<' ';
        j=(j+1)%maxSize;
    }
    cout<<endl;
}

3.链接队列的实现

#include "queue.h"
 
template <class T> class LinkQueue;
template <class T>
class QueueNode
{
private:
    T element;
    QueueNode<T> *link;
    friend class LinkQueue<T>;
};
 
template <class T>
class LinkQueue:public Queue<T>
{
private:
    QueueNode<T> *front,*rear;
public:
    LinkQueue();
    ~LinkQueue();
    bool IsEmpty() const;
    //bool IsFull() const;
    bool Front(T &x) const; //返回队首元素给x
    bool EnQueue(T x);      //队尾x入队列
    bool DeQueue();         //队首出队列
    bool Clear();
    void Print() const;
};

#include "linkqueue.h"
 
template <class T>
LinkQueue<T>::LinkQueue()   //带有表头,front始终指向一个空节点
{
    front=new QueueNode<T>;
    front->link=NULL;
    rear=front;
}
 
template <class T>
LinkQueue<T>::~LinkQueue()
{
    QueueNode<T> *p;
    while(front)
    {
        p=front;
        front=front->link;
        delete p;
    }
}
 
template <class T>
bool LinkQueue<T>::IsEmpty() const
{
    return front==rear;
}
 
 
 
template <class T>
bool LinkQueue<T>::Front(T &x) const
{
    if(IsEmpty())
    {
        cout<<"Front:the linkqueue is empty"<<endl;
        return false;
    }
    x=front->link->element;
    return true;
}
 
template <class T>
bool LinkQueue<T>::EnQueue(T x)
{
    QueueNode<T> *p=new QueueNode<T>;
    p->element=x;
    rear->link=p;
    p->link=NULL;
    rear=p;
    return true;
}
 
template <class T>
bool LinkQueue<T>::DeQueue()
{
    if(IsEmpty())
    {
        cout<<"DeQueue:the linkqueue is empty"<<endl;
        return false;
    }
    QueueNode<T> *p;
    p=front;
    front=front->link;
    delete p;
    return true;
}
 
template <class T>
bool LinkQueue<T>::Clear()
{
    QueueNode<T> *p;
    while(front->link)
    {
        p=front->link;
        front->link=p->link;
        delete p;
    }
    rear=front;
    return true;
}
 
template <class T>
void LinkQueue<T>::Print() const
{
    QueueNode<T> *p=front->link;
    while(p)
    {
        cout<<p->element<<' ';
        p=p->link;
    }
    cout<<endl;
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容