循环队列使用数组实现的话,简单、方便。之前实现的队列,当尾端索引到达队列最后的时候,无论前面是否还有空间,都不能再添加数据了。循环队列使得队列的存储单元可以循环利用,它需要一个额外的存储单元来判断队列是否已满。
#pragma once #ifndef MSGQUEUE_H_ #define MSGQUEUE_H_ #include "SerialApi.h" #include <queue> #include <iostream> using namespace std; template<typename T> class MsgQueue{ public: MsgQueue(size_t sz); //构造 ~MsgQueue(); public: bool isEmpty(); //判断队列是否为空 bool isFull(); //判断队列是否为满 void Push(T &val); //入队操作 T Pop(); //出队操作 T getFront(); T getRear(); size_t getRealSize(); private: size_t front,rear,size; T *data; }; template<typename T> MsgQueue<T>::MsgQueue(size_t sz) { rear = front = 0; size = sz + 1; data = new T[size]; } template<typename T> MsgQueue<T>::~MsgQueue() { delete []data; } template<typename T> bool MsgQueue<T>::isEmpty() { return (front == rear); } template<typename T> bool MsgQueue<T>::isFull() { return (((rear+1) % size) == front); } template<typename T> void MsgQueue<T>::Push(T &val) { if(!isFull()) { data[rear] = val; rear = (rear + 1) % size; } else { printf("The queue is full! "); } } template<typename T> T MsgQueue<T>::Pop(void ) { T temp; if(!isEmpty()) { temp = data[front]; data[front] = NULL; front = (front+1) % size; return data[temp]; } else { printf("The queue is empty! "); return ; } } template<typename T> T MsgQueue<T>::getFront() { if(isEmpty()) { printf("The queue is empty! "); } return data[front]; } template<typename T> T MsgQueue<T>::getRear() { return data[rear]; } template<typename T> size_t MsgQueue<T>::getRealSize() { size_t realSize = (rear - front + size) % size; return realSize; } #endif //MSGQUEUE_H_
MsgQueue<int> *Q = new MsgQueue<int>(20); for(int i=0;i<20;i++) { Q->Push(i); } cout<<Q->getFront()<<endl; cout<<Q->getRealSize()<<endl;
参考链接:http://www.cnblogs.com/wxxweb/archive/2011/05/26/2059166.html
注意:模板声明和实现要放在同一文件夹中,而不能够把声明放在了.h文件中,把实现放在了.cpp文件中。