数据结构队列C++实现 链式和循环

#include <iostream>
#include <stdexcept>
#include <string>
using namespace std;
namespace my_space
{
    template<class ElemType>
    class queue
    {
    public:
        queue();               //初始化队列
        ~queue();              //销毁队列
        bool empty() const;    //判断队列是否为空
        int length() const;    //返回队列的长度
        ElemType gethead() throw(out_of_range); //返回队列的队首元素
        void push_back(ElemType e);                 //插入元素到队尾
        ElemType pop_front() throw(out_of_range);    //删除队头元素
    private:
        class qnode
        {
        public:
            ElemType data;
            qnode *next;
        };
        qnode *front;
        qnode* rear;
        int size;
    };
    template<class ElemType>
    queue<ElemType>::queue() : size(0)
    {
        front = rear = new qnode;
        front -> next = NULL;
    }
    template<class ElemType>
    queue<ElemType>::~queue()
    {
        while(front)
        {
            rear = front -> next;
            delete front;
            front = rear;
        }
}
    template<class ElemType>
    bool queue<ElemType>::empty() const
    {
        return size == 0;
    }
    template<class ElemType>
    int queue<ElemType>::length() const
    {
        return size;
    }
    template<class ElemType>
    ElemType queue<ElemType>::gethead() throw(out_of_range)
    {
        if(empty())
            throw("queue is empty");
        return front -> next -> data;
    }
    template<class ElemType>
    void queue<ElemType>::push_back(ElemType e)
    {
        qnode *p = new qnode;
        p -> data = e;
        p -> next = NULL;
        rear -> next = p;
        rear = p;
        ++size;
    }
    template<class ElemType>
    ElemType queue<ElemType>::pop_front() throw(out_of_range)
    {
        if(empty())
            throw("queue is empty");
        qnode *p;
        p = front -> next;
        front -> next = p -> next;
        if(rear == p)
            rear = front;
        ElemType e = p -> data;
        delete p;
        --size;
        return e;
    }
}
int main()
{
    return 0;
}

#include <iostream>
#include <stdexcept>
using namespace std;
template<class ElemType>
class cqueue
{
public:
    cqueue();            //初始化循环队列
    ~cqueue();           //销毁循环队列
    void push_back(ElemType e) throw(out_of_range);//插入元素到队尾
    ElemType pop_front() throw(out_of_range);       //删除队头元素并返回其值
    ElemType get_front() throw(out_of_range);       //返回队头元素
    bool empty() const;         //判断队列是否为空
    int length() const;         //返回队列的长度
private:
    static const int maxqsize = 100;  //最大队列长度
    class sqQueue
    {
    public:
        ElemType *base;       //初始化的动态分配储存空间
        int front;            //头指针,若队列不空,指向队列头元素
        int rear;             //尾指针,若队列不空,指向队列尾元素的下一个位置
    };
    int len;
    sqQueue Q;
};
template<class ElemType>
cqueue<ElemType>::cqueue() : len(0)
{
    Q.base = new ElemType[maxqsize];
    Q.front = Q.rear = 0;
}
template<class ElemType>
cqueue<ElemType>::~cqueue()
{
    delete [] Q.base;
    len = 0;
    Q.front = Q.rear = 0;
}
template<class ElemType>
void cqueue<ElemType>::push_back(ElemType e) throw(out_of_range)
{
    if(len == maxqsize - 1)
        throw("the queue is full");
    Q.base[Q.rear + 1] = e;
    Q.rear = (Q.rear + 1) % maxqsize;
    ++len;
}
template<class ElemType>
ElemType cqueue<ElemType>::pop_front() throw(out_of_range)
{
    if(empty())
        throw("queue is empty");
    Q.front = (Q.front + 1) % maxqsize;
    --len;
    return Q.base[Q.front];
}
template<class ElemType>
ElemType cqueue<ElemType>::get_front() throw(out_of_range)
{
    if(empty())
        throw("queue is empty");
    return Q.base[Q.front];
}
template<class ElemType>
bool cqueue<ElemType>::empty() const
{
    return (len == 0);
}
template<class ElemType>
int cqueue<ElemType>::length() const
{
    return len;
}
int main()
{
    return 0;
}

转载于:https://my.oschina.net/u/196018/blog/383802

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值