队列:在队尾插入元素,在队头删除元素,符合先进先出原则;
栈:符合先进后出原则;队列的分类:
1.顺序队列
2.循环队列
3.链式队列
4.优先级队列
5.双端队列
循环队列的实现方法:
方法一:使用rear和front标记,当rear走到最后一个元素时,下一步为rear=rear%最大容量,当(rear+1)%最大容量=front时,表示队列已满,队列空的标记仍旧为rear=front
方法二:设置一个标记flag,初始值为0,插入元素时flag=1,删除元素时flag=0;
当rear==front && flag==0时表示队列空
当rear==front && flag==1时表示队列已满
方法三:设置一个计数器count,当元素入队列时,count+1,当元素出队列时,count-1,count==capacity(容量)时,表示队列满;
第三种方法的代码如下:
#include<iostream>
using namespace std;
template<class T>
class Queue
{
public:
Queue(size_t capacity = 5)
:_front(0)
,_rear(0)
,_capacity(capacity+3)
,_count(0)
{
_pData=new T[_capacity];
}
void Push(const T& x)
{
if(_count==_capacity)
{
cout<<"队列已满"<<endl;
return;
}
_pData[_rear]=x;
_rear=(_rear+1)%_capacity;
_count++;
}
void Pop()
{
if(Empty())
{
cout<<"队列已空"<<endl;
return;
}
_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:
T* _pData;
size_t _capacity;
size_t _front;
size_t _rear;
size_t _count;
};
测试代码:
void FunTest()
{
Queue<int> q;
q.Push(1);
q.Push(2);
q.Push(3);
q.Push(4);
q.Push(5);
q.Push(6);
q.Push(7);
q.Push(8);
cout<<q.Size()<<endl;
cout<<q.Front()<<endl;
cout<<q.Back()<<endl;
q.Pop();
q.Pop();
cout<<q.Size()<<endl;
cout<<q.Front()<<endl;
cout<<q.Back()<<endl;
q.Pop();
q.Pop();
q.Pop();
q.Pop();
q.Pop();
q.Pop();
cout<<q.Empty()<<endl;
cout<<q.Size()<<endl;
}
int main()
{
FunTest();
return 0;
}