Queue.h
#ifndef _MYQUEUE_H
#define _MYQUEUE_H
#include<iostream>
using namespace std;
template<class T>
class Queue{
public:
Queue(int len = 10);
~Queue();
bool IsEmpty() const;
T& Front() const;
T& Rear() const;
void Push(const T& item);
void Pop();
private:
T* queue;
int front;
int rear;
int length;
};
template<class T>
inline
Queue<T>::Queue(int len):length(len){
if(len < 1) throw "Queue length must be > 0";
queue = new T[len];
front = rear = 0;
}
template<class T>
inline
bool Queue<T>::IsEmpty() const{
return front == rear;
}
template<class T>
inline
void Queue<T>::Push(const T& item){
if((rear + 1) % length == front){
//加倍
T* newQueue = new T[2*length];
int start = (front+1) % length;
if(start < 2){//没有回转
copy(queue+start, queue+start+length-1, newQueue);
}else{//回转
copy(queue+start, queue+length, newQueue);
copy(queue, queue+rear+1, newQueue+length-start);
}
front = 2*length -1;
rear = length - 2;
length *= 2;
delete queue;
queue = newQueue;
}
if(rear == length-1)
rear = 0;
else
rear ++;
//rear = (rear + 1) % length;
queue[rear] = item;
}
template<class T>
inline
T& Queue<T>::Front() const{
if(IsEmpty()) throw "queue is empty";
return queue[(front + 1)%length];
}
template<class T>
inline
T& Queue<T>::Rear() const{
if(IsEmpty()) throw "queue is empty";
return queue[rear];
}
template<class T>
inline
void Queue<T>::Pop(){
if(IsEmpty()) throw "queue is empty";
front ++;
queue[front].~T();
}
template<class T>
inline
Queue<T>::~Queue(){
delete[] queue;
}
#endif
Queue_test.cpp
#include <iostream>
#include "Queue.h"
using namespace std;
int main(int argc, char** argv) {
Queue<int> q(1);
q.Push(5);
q.Push(3);
q.Push(4);
q.Pop();
cout << q.Front();
return 0;
}