队列的最重要的特点就是先进先出(FIFO),所以需要两个指针来分别进行入队列和出队列。
下面的代码只能简单实现入队列和出队列,以及当容量不足时扩大容量。
#include <iostream>
#include <windows.h>
using namespace std;
template<class T>
class Queue
{
public:
Queue(size_t capacity = 5)
:_capacity(capacity)
,_front(0)
,_rear(0)
,_count(0)
{
_pData = new T[_capacity+3];
}
void Push(const T& x)
{
CheckCapacity();
_pData[_rear] = x;
_count++;
_rear = (_rear+1) % _capacity;
}
void Pop()
{
if(!Empty())
{
_count--;
_front = (_front+1) % _capacity;
}
}
T& Front()
{
return _pData[_front];
}
const T& Front()const
{
return _pData[_front];
}
T& Back()
{
return _pData[(_rear-1) % _capacity];
}
const T& Back()const
{
return _pData[(_rear-1) % _capacity];
}
size_t Size()const
{
return _count;
}
bool Empty()const
{
return 0==_count;
}
~Queue()
{
if(_pData)
{
delete[] _pData;
_pData = NULL;
}
}
private:
void CheckCapacity()
{
if(_count == _capacity)
{
T* temp = new T[_capacity*2+3];
for(size_t i=0; i<_count; ++i)
temp[i] = _pData[i];
delete[] _pData;
_pData = temp;
_capacity = _capacity*2+3;
_rear = _count;
}
}
private:
T* _pData;
size_t _capacity;
size_t _front;
size_t _rear;
size_t _count;
};
int main()
{
Queue<int> arr(3);
cout<<arr.Size()<<endl;
arr.Push(1);
arr.Push(2);
arr.Push(3);
arr.Push(4);
arr.Push(5);
arr.Push(6);
cout<<arr.Front()<<endl;
cout<<arr.Back()<<endl;
cout<<arr.Size()<<endl;
arr.Pop();
arr.Pop();
arr.Pop();
cout<<arr.Size()<<endl;
cout<<arr.Front()<<endl;
cout<<arr.Back()<<endl;
system("pause");
return 0;
}