C++primer 泛型编程环形数组队列模板

#ifndef _QUEUE_H
#define _QUEUE_H
#include<iostream>
template<typename T>
class Queue
{
public:
    Queue(int queueCapacity = 10);    //队列默认大小为10
    bool IsEmpty() const;            //判断是否为空
    T& Front() const;            //查看、读取队首
    T& Rear() const;            //查看、读取队尾
    void Push(const T& item);       //队尾插入
    void Pop();                       //队首删除

private:
    T* queue;
    int front;      //队首
    int rear;       //队尾
    int capacity;    //容量、扩容
};

template<typename 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<typename T>     /*判断是否为空*/
inline bool Queue<T>::IsEmpty() const
{
    return front == rear;
}

template<typename T>       /*查看、读取队首*/
inline T& Queue<T>::Front() const
{
    if (IsEmpty())
        throw "Queue is empty. No front elment";
    return queue[(front + 1) % capacity];
}

template<typename T>        /*查看、读取队尾*/
inline T& Queue<T>::Rear() const
{
    if (IsEmpty())
        throw "Queue is empty. No rear element";
    return queue[rear];
}

template<typename T>      /*队尾插入*/
void Queue<T>::Push(const T& item)
{
    /*
    if (rear == capacity - 1)         //是否为最后一个
        rear = 0;
    else                             //没有到最后
    rear++;
    */
    if ((rear + 1) % capacity == front) //内存加倍
    {
        
        T* newQueue = new T[2 * capacity];

        int start = (front + 1) % capacity;
        if (start < 2)           //front在第一个,复制整个队列到新数组中
            std::copy(queue + start, queue + start + capacity - 1, newQueue);
        else                     //复制两段
        {
            std::copy(queue + start, queue + capacity, newQueue);
            std::copy(queue, queue + rear + 1, newQueue + capacity - start);
        }
        front = 2 * capacity - 1;    //队首放在最后
        rear = capacity - 2;        //队尾位置,因为原来的数组队首为空(capacity -1)-1
        capacity *= 2;                //长度变为两倍
        delete[] queue;
        queue = newQueue;
    }

    rear = (rear + 1) % capacity;    //取余
    queue[rear] = item;
}


template<typename T>        /*队首删除*/
void Queue<T>::Pop()
{
    if (IsEmpty())
        throw "Queue is empty.No front elemnt";
    front = (front + 1) % capacity;
    queue[front].~T();            //可能是对象类型
}
#endif

测试代码

#include<iostream>
#include"queue.h"

using namespace std;

int main()
{
    cout << "测试整型顺序队列" << endl;
    Queue<int> q;
    q.Push('1');
    q.Push('2');
    q.Push('3');
    cout << "队首:" << q.Front() << " 队尾:" << q.Rear() << endl;
    q.Push('4');
    q.Push('5');
    q.Pop();
    cout << "队首:" << q.Front() << " 队尾:" << q.Rear() << endl;
    cout << endl;

    cout << "测试字符型顺序队列" << endl;
    Queue<char> chars;    
    chars.Push('A');
    chars.Push('B');
    chars.Push('C');
    cout << "队首:"<< chars.Front() << " 队尾:" << chars.Rear() << endl;
    chars.Push('D');
    chars.Push('E');
    chars.Pop();
    cout << "队首:" << chars.Front() << " 队尾:" << chars.Rear() << endl;
    cout << endl;

    cout << "测试字符串顺序队列" << endl;
    Queue<string> str;
    str.Push("fan");
    str.Push("xing");
    str.Push("xing");
    cout << "队首:" << str.Front() << " 队尾:" << str.Rear() << endl;
    str.Push("bo");
    str.Push("yun");
    str.Pop();
    cout << "队首:" << str.Front() << " 队尾:" << str.Rear() << endl;

    return 0;
}