其他数据结构链接如下:
队列:一个动态集合,插入操作称为入队,删除操作称为出队,特点是先进先出。
实现的代码如下:
#include <iostream>
#include <memory>
using namespace std;
template<typename T>
class MyQueue{
private:
unsigned int iTail = 0;
unsigned int iHead = 0;
int iSize = 0;
int iNum = 0;//记录队列中有效元素的位数
T *pData;
public:
MyQueue()=delete;//将默认构造函数删掉(或者将其声明到private属性也可以),用户调用MyQueue(int size)构造函数
MyQueue(int size)
{
this->iSize = size;
pData = new T[size];
for(int i = 0; i < size; i++)
{
pData[i] = 0;
}
}
~MyQueue()
{
if(pData != nullptr)
{
delete pData;
}
}
//重新设置队列大小,若是缩小队列长度可能会导致队列的头和尾指向的位置发生变化。
void set_size(int size)
{
if(pData == nullptr)
{
pData = new T[size];
this->iSize = size;
}
else
{
T* pTmpData = new T[size];
if(size < this->iSize)
{
for(int i = 0; i < size; i++)
{
pTmpData[i] = pData[i];
}
if(iNum > size)
{
iNum = size;
}
}
else
{
for(int i = 0; i < size; i++)
{
if(i < this->iSize)
{
pTmpData[i] = pData[i];
}
else
{
pTmpData[i] = 0;
}
}
}
this->iSize = size;
delete pData;
pData = pTmpData;
}
}
bool empty()
{
return iNum == 0;
}
bool full()
{
return iNum == iSize;
}
const int get_size()
{
return iSize;
}
const int get_head()//因为队列是先进先出,用两个变量分别记录其头和尾。因此插入一个元素iHead会递增(可能会超过iSize的总大小),不过其真实下标是iHead % iSize,tail亦是。
{
return iHead % iSize;
}
const int get_tail()
{
return iTail % iSize;
}
bool en_queue(T value)
{
if(full())
{
cout << "failed enqueue, queue is full" << endl;
return false;
}
pData[iHead%iSize] = value;
iHead++;
iNum++;
return true;
}
//注意get_queue和de_queue的区别
bool get_queue(T &Value)
{
if(empty())
{
cout << "failed get_queue, queue is empty" << endl;
return false;
}
Value = pData[iTail%iSize];
return true;
}
bool de_queue(T &Value)
{
bool ret = get_queue(Value);
if(ret)
{
iTail++;
iNum--;
}
return ret;
}
};
int main()
{
MyQueue<int> _queue(10);
cout << "queue size " << _queue.get_size() << endl;
for(int i = 0; i < 11; i++)
{
_queue.en_queue(i);
}
for(int i = 0; i < 11; i++)
{
int iValue;
if(_queue.de_queue(iValue))
{
cout << "iValue : " << iValue << endl;
}
}
return 0;
}