#ifndef UNTITLED_QUEUE_H #define UNTITLED_QUEUE_H #include <iostream> template<typename T> class Queue{ private: int Capacity;//容量 int Size;//大小 int front;//对头 int rear;//队尾 T *data; public: Queue(int size = 100); ~Queue(); int size();//返回大小 int capacity();//返回容量 bool empty();//判空 bool full();//判满 void clear();//清空 void reSize(int n);//调整容量 void destroy();//销毁队列 void push(const T x);//入队 void traverse();//遍历 T pop();//出队 T head();//队首元素 Queue &operator=(const Queue &q);//拷贝赋值函数 }; template<typename T> Queue<T>::Queue(int size){ Capacity = size; data = new T[size]; front = rear = 0; } template<typename T> Queue<T>::~Queue(){ destroy(); } //返回大小 template<typename T> int Queue<T>::size(){ return Size; } //返回容量 template<typename T> int Queue<T>::capacity(){ return Capacity; } //判空 template<typename T> bool Queue<T>::empty(){ return Size; } //判满 template<typename T> bool Queue<T>::full(){ return Size + 1 == Capacity; } //清空 template<typename T> void Queue<T>::clear(){ Size = 0; front = rear = 0; } //销毁队列 template<typename T> void Queue<T>::destroy(){ if (data) delete [] this->data; data = nullptr; Size = 0; Capacity = 0; front = rear = 0; } //调整容量 template<typename T> void Queue<T>::reSize(int n){ T *p = new T[n]; for (int i = 0; i < Capacity; ++i) { p[i] = data[i];//如果是对象必须有拷贝赋值函数 } this->Capacity = n; delete [] data; data = p; } //入队 template<typename T> void Queue<T>::push(const T x){ if (full()) reSize(2 * Capacity); data[rear] = x; rear = (rear + 1) % Capacity; //在reSize()前这里就已经归0了。 Size++; } //出队 template<typename T> T Queue<T>::pop(){ if (!empty()){ std::cerr << "队空的,无法出队!\n"; return 0; } T r = data[front]; front = (front + 1) % Capacity; Size--; return r; } //拷贝赋值函数 template<typename T> Queue<T> &Queue<T>::operator=(const Queue &q){ if (data) destroy(); Capacity = q.Capacity; data = new T[Capacity]; Size = q.Size; for (int i = 0; i < q.Size; ++i) { data[i] = q.data[i]; } rear = q.rear; front = q.front; return *this; } //队首元素 template<typename T> T Queue<T>::head() { if (!empty()){ std::cerr << "队空的,没有队首!\n"; return 0; } return data[front]; } //遍历 template<typename T> void Queue<T>::traverse() { for (int i = front, c = 0; c < Size; ++c) { std::cout <<" " << data[i]; i = (i+1) % Capacity; } std::cout << std::endl; } #endif //UNTITLED_QUEUE_H
原文:https://www.cnblogs.com/niubidexiebiao/p/13053338.html