把队列这种头尾相接的顺序存储结构称为循环队列
front:指向对头元素的位置
rear:指向队尾元素的下一个位置
对列满的条件:(real + 1) % QueueSize == front
当对满时,数组中还有一个空闲的元素。
队列长度:(rear - front + QueueSize) % QueueSize
#include <iostream>
const unsigned MAX_SIZE = 10;
template<typename T>
class CycleQueue
{
public:
CycleQueue();
~CycleQueue();
void mvPop(); // 出队
void mvPush(const T& d); // 入队
bool mbIsFull() { return (((miRear + 1) % MAX_SIZE) == miFront); }
int miGetSize() { return ((miRear - miFront + MAX_SIZE) % MAX_SIZE); }
private:
unsigned miFront; // 队头索引
unsigned miRear; // 队尾索引
T* mopData;
};
template<typename T>
CycleQueue<T>::CycleQueue() : miFront(0), miRear(0)
{
mopData = new T[MAX_SIZE];
}
template<typename T>
CycleQueue<T>::~CycleQueue()
{
if (mopData != nullptr) {
delete [] mopData;
}
}
template<typename T>
void CycleQueue<T>::mvPop()
{
if (miFront == miRear) {
std::cout << "Pop Error : Cycle Queue is Empty!" << std::endl;
return;
}
// 队头索引向后移一位置,若到最后则转到数组头部
miFront = (miFront + 1) % MAX_SIZE;
}
template<typename T>
void CycleQueue<T>::mvPush(const T& d)
{
// 判断队满
if (((miRear + 1) % MAX_SIZE) == miFront) {
std::cout << "Push Error : Cycle Queue is Full!" << std::endl;
return;
}
//将元素d赋值给队尾
mopData[miRear] = d;
// 队尾索引向后移一位置,若到最后则转到数组头部
miRear = (miRear + 1) % MAX_SIZE;
}
int main()
{
CycleQueue<int> cq;
cq.mvPush(1);
cq.mvPop();
system("pause");
return 0;
}