队列

Queue.h
#ifndef QUEUE_H_
#define QUEUE_H_

using namespace std;
template <class T>
class Queue
{
public:
        Queue(int queueCapacity=10);
        bool IsEmpyt()const;
        T &Front()const; //查看队首数据
        T &Rear()const; //查看队尾数据

        void Push(const T& item);
        void Pop();

private:
        T *queue;
        int front;//记录队首下标
        int rear;//记录队尾下标
        int capacity;
};

template <class T>
Queue<T>::Queue(int queueCapacity):capacity(queueCapacity)
{
        if(capacity < 1)
                throw "Queue capacity must be > 0";
        queue  = new T[capacity];
        front = rear = 0;
}

template <class T>
inline bool Queue<T>::IsEmpyt()const
{
        return front == rear;
}

template <class T>
void Queue<T>::Push(const T& item)
{

        if((rear+1)%capacity == front)//队列满了
        {
                T *newQueue = new T[2*capacity];
                int start = (front+1) % capacity;
                if(start<2) //没有发生回绕
                        copy(queue+start,queue+start+capacity-1,newQueue);
                else
                {
                        copy(queue+start,queue+capacity,newQueue);
                        copy(queue,queue+rear+1,newQueue+capacity -start);
                }
                front = 2 *capacity -1;
                rear = capacity -2;
                capacity *=2;
                delete [] queue;
                queue = newQueue;
        }
        if(rear == capacity-1)
                rear = 0;
        else
                rear++;
        queue[rear] = item;
  /*rear = (rear+1) % capacity
        queue[rear] = item;
 */
}

template <class T>
inline T &Queue<T>::Front()const
{
        if(IsEmpyt())
                throw "Queue is Empty ";
        return queue[(front+1)%capacity];
}

template <class T>
inline T &Queue<T>::Rear()const
{
        if(IsEmpyt())
                throw "Queue is Empyt";
        return queue[rear];
}

template <class T>
void Queue<T>::Pop()
{
        if(IsEmpyt())
                throw "Queue is empty";
        front = (front+1) % capacity;
        queue[front].~T();
}

#endif

 

转载于:https://my.oschina.net/osyunwei/blog/716561

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值