#ifndef _顺序队列_H
#define _顺序队列_H
template<class T> // 类模板,
class Queue
{
public:
Queue(int queueCapacity=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<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>::IsEmpty() 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); // capacity是代表原来的容量,
}
front = 2*capacity-1; // 队首放在了新建容器的最后边,
rear = capacity - 2;
capacity *= 2;
delete [] queue;
queue = newQueue;
}
/*if(rear == capacity - 1)
rear = 0;
else
rear++;*/
rear = (rear + 1) % capacity;
queue[rear] = item;
}
template<class T>
inline T& Queue<T>::Front() const
{
if(IsEmpty()) throw "Queue is empty. No front element.";
return queue[(front+1) % capacity];
}
template<class T>
inline T& Queue<T>::Rear() const
{
if(IsEmpty()) throw "Queue is empty. No rear element";
return queue[rear];
}
template<class T>
void Queue<T>::Pop()
{
if(IsEmpty()) throw "Queue is empty, Cannot delete";
front = (front + 1) % capacity;
queue[front].~T();
}
#endif _顺序队列_H
#include <iostream>
#include "顺序队列.h"
using namespace std;
int main()
{
Queue<char> q(4);
q.Push('c');
q.Push('u');
q.Push('i');
cout << q.Front() << ", " << q.Rear() << endl;
/*q.Pop();
cout << q.Front() << ", " << q.Rear() << endl;*/
q.Push('y');
q.Push('u');
q.Push('m');
cout << q.Front() << ", " << q.Rear() << endl;
cout<< "xiao cui" << endl;
return 0;
}