Queue(队列 C++模版实现)
#ifndef C11LEARN_QUEUE_H
#define C11LEARN_QUEUE_H
template<typename T>
class Queue
{
private:
int tail;
int head;
int capacity;
T *array;
public:
Queue(int capacity = 50);
Queue(const Queue<T> &queue);
Queue &operator =(const Queue<T> queue);
virtual ~Queue();
void enqueue(const T &element);
T dequeue();
bool empty();
bool full();
};
template<typename T>
Queue<T>::Queue(int capacity):capacity(capacity) {
if(this->capacity < 20)
this->capacity = 20;
array = new T[capacity];
head = tail = 0;
}
template<typename T>
Queue<T>::Queue(const Queue<T> &queue){
capacity = queue.capacity;
array = new T[capacity];
head = queue.head;
tail = queue.tail;
for (int i = 0; i < capacity; ++i) {
array[i] = queue.array[i];
}
}
template<typename T>
Queue<T>& Queue<T>::operator =(const Queue<T> queue){
if(array!= nullptr)
delete[] array;
capacity = queue.capacity;
array = new T[capacity];
head = queue.head;
tail = queue.tail;
for (int i = 0; i < capacity; ++i) {
array[i] = queue.array[i];
}
return *this;
}
template<typename T>
Queue<T>::~Queue() {
delete[] array;
}
template<typename T>
void Queue<T>::enqueue(const T& element) {
if(full())
throw "overflow";
array[tail] = element;
if(tail == capacity - 1)
tail = 0;
else
tail++;
}
template<typename T>
T Queue<T>::dequeue() {
if(empty())
throw "underflow";
T element = array[head];
if(head == capacity-1)
head = 0;
else
head++;
return element;
}
template<typename T>
bool Queue<T>::empty() {
return head == tail;
}
template<typename T>
bool Queue<T>::full() {
return head == (tail + 1 == capacity?0:tail+1);
}
#endif