隊列:在隊尾插入元素,在隊頭刪除元素,符合先進先出原則;
棧:符合先進後出原則;隊列的分類:
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;
}