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 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 SeqQueue:public Queue
{
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 
SeqQueue::SeqQueue(int mSize)
{
    maxSize=mSize;
    q=new T[maxSize];
    front=rear=0;
}
 
template 
SeqQueue::~SeqQueue()
{
    delete [] q;
}
 
template 
bool SeqQueue::IsEmpty() const
{
    return front==rear;
}
 
template 
bool SeqQueue::IsFull() const
{
    return (rear+1)%maxSize==front;
}
 
template 
bool SeqQueue::Front(T &x) const
{
    if(IsEmpty())
    {
        cout<<"Front:the seqqueue is empty"<
bool SeqQueue::EnQueue(T x)
{
    if(IsFull())
    {
        cout<<"EnQueue:the seqqueue is full"<
bool SeqQueue::DeQueue()
{
    if(IsEmpty())
    {
        cout<<"DeQueue:the seqqueue is empty"<
bool SeqQueue::Clear()
{
    rear=front=0;
    return true;
}
 
template 
void SeqQueue::Print() const
{
    int j=front;
    while(j%maxSize!=rear)
    {
        cout<

3.链接队列的实现

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

你可能感兴趣的:(queue实现)