实现一个简单的环形队列,初始指定大小,不自动进行扩容,支持出队列,入队列,判断队列是否已满,打印队列信息,获取队列长度等接口,使用模板实现,支持自定义数据类型,具体实现代码如下:
#ifndef MYCIRCLEQUEUE_H
#define MYCIRCLEQUEUE_H
#include <string>
#include <iostream>
using namespace std;
template <class T>
Class MyCircleQueue
{
public:
MyCircleQueue(int capacity);
virtual ~MyCircleQueue();
//清队列
void ClearQueue();
//入队列
bool Push(T element);
//出队列
bool Pop(T &element);
//获取队列长度
const int Size();
//判断队列是否空了
const bool IsEmpty();
//判断队列是否满了
const bool IsFull();
//输出队列信息
void PrintData(void(*pFunc)(T&));
private:
T* m_pArray = nullptr; //队列数据
int m_nCapacity = 0; //队列容量
int m_nHead = 0; //队首
int m_nTail = 0; //队尾
int m_nLength = 0; //队列长度
}
template <class T>
MyCircleQueue<T>::MyCircleQueue(int capacity)
{
m_nCapacity = capacity;
ClearQueue();
if((m_pArray = new T[m_nCapacity]) == nullptr)
{
throw string("queue new failed");
}
}
template <class T>
MyCircleQueue<T>::~MyCircleQueue()
{
delete[] m_pArray;
m_pArray = nullptr;
}
template <class T>
void MyCircleQueue<T>::ClearQueue()
{
m_nHead = 0;
m_nTail = 0;
m_nLength = 0;
}
template <class T>
bool MyCircleQueue<T>::Push(T element)
{
if(IsFull())
return false;
m_pArray[m_nTail] = element;
m_nLength++;
m_nTail++;
m_nTail = m_nTail % m_nCapacity;
return true;
}
template <class T>
bool MyCircleQueue<T>::Pop(T &element)
{
if(IsEmpty())
return false;
element = m_pArray[m_nHead];
m_nLength--;
m_nHead++;
m_nHead = m_nHead % m_nCapacity;
return true;
}
template <class T>
const bool MyCircleQueue<T>::IsEmpty()
{
return m_nLength == 0;
}
template <class T>
const bool MyCircleQueue<T>::IsFull()
{
return m_nLength == m_nCapacity;
}
template <class T>
void MyCircleQueue<T>::PrintData(void(*pFunc)(T&))
{
for(int i = m_nHead; i < m_nHead + m_nLength; i++)
{
if(nullptr != pFunc)
{
pFunc(m_pArray[i % m_nCapacity]);
}
}
}
#endif //MYCIRCLEQUEUE_H