C++循环队列
自定义循环队列
#pragma once
//循环队列
template<class DataType>
class ELoopQueue {
private:
int Size;//队列大小
int Count;//队列成员数量
int HeadId;//队首索引
DataType **Date;//队列
public:
//循环队列
//size : 循环队列大小(size >= 1)
explicit ELoopQueue(int size) {
if (size < 1)
throw "尝试创建空间不足1的循环队列";
Size = size;
Count = 0;
HeadId = 0;
Date = new DataType *[size];
}
//析构函数
~ELoopQueue() {
delete[] Date;
}
//进队
//data 进队成员
//return true(进队成功) / false(进队失败)
bool Enqueue(DataType &data) {
if (Count == Size)
return false;
Date[(HeadId + Count) % Size] = &data;
++Count;
return true;
}
//入队
//data : 入队成员
//return true(进队成功) / false(进队失败)
bool Enqueue(DataType &&data) {
return Enqueue(data);
}
//构造入队成员
//ParamsType : 入队成员构造函数参数类型
//params : 入队成员构造函数参数
//return true(进队成功) / false(进队失败)
template<class... ParamsType>
bool Enqueue(const ParamsType &&... params) {
return Enqueue(*(new DataType(params...)));
}
//出队
//return : DataType * (队首成员指针) / null(不存在)
DataType *Dequeue() {
if (Count == 0)
return nullptr;
auto front = Date[HeadId];
HeadId = (HeadId + 1) % Size;
--Count;
return front;
}
//队首
//return : DataType * (队首成员数据指针) / nullptr(不存在)
DataType *Front() {
if (Count == 0)
return nullptr;
return Date[HeadId];
}
//队尾
//return : DataType * (队尾成员数据指针) / nullptr(不存在)
DataType *Back() {
if (Count == 0)
return nullptr;
return Date[(HeadId + Count - 1) % Size];
}
//队列成员索引访问
//return DataType * (索引处的队列成员指针) / null(不存在)
DataType *operator[](int index) {
if (Count == 0)
return nullptr;
if (index + 1 > Count)
return nullptr;
return Date[(HeadId + index) % Size];
}
//获取队列大小
//return int(队列大小)
int GetSize() {
return Size;
}
//获取队列成员数量
//return int(队列成员数量)
int GetCount() {
return Count;
}
//满
//return true(满) / false(非满)
bool Full() {
return Count == Size;
}
//空
//return true(空) / false(非空)
bool Empty() {
return Count == 0;
}
//重新设置大小(size > Count)
//return true(重置成功) : false(重置失败)
bool Resize(int size) {
if (size < Count)
return false;
auto NewDate = new DataType *[size];
for (int i = 0; i < Count; ++i) {
NewDate[i] = Date[(HeadId + i) % Size];
}
delete[] Date;
Size = size;
HeadId = 0;
Date = NewDate;
return true;
}
};
如有错误、更优、新增功能等问题,请指出,笔者会尽快修改。