用c++基於模板實現的可設定容量的佇列(Queue)
阿新 • • 發佈:2018-12-14
環境介紹
- c++14標準,clion+mingw編譯成功,vs2008下面編譯也成功
佇列及實現介紹
- 先進先出的特性
- 實現時基於陣列的,可以構造時傳入佇列容量
- 由於基於模板程式設計,佇列可以儲存多種資料型別,便於擴充套件
- 實現了基本操作:尾部插入、頭部刪除、遍歷
原始碼
- 程式碼在vs2008上也可以直接執行
#include <iostream>
template <class T> class Queue
{
public:
Queue(int);
~Queue();
bool Insert(T);
T Delete();
void Destroy();
void Traverse();
private:
int max_size;
int front;
int rear;
T* arry;
};
template <class T> Queue<T>::Queue(int size) {
front = -1;
rear = -1;
if(size<=0)
return;
arry = new T[size];
max_size = size;
}
template <class T> Queue<T>::~Queue() {
delete []arry;
}
template <class T> bool Queue<T>::Insert(T t) {
if(front == -1)//去除size為1的bug,佇列容量為1時,實際上可以插入,但是由於qCount計算為1,等於最大容量,導致不能插入的bug
{
front++;
arry[++rear]=t;
return true;
}
int qCount = abs(rear-front)+1 ;
if(qCount==max_size)//先判滿
{
std::cout<<"queue is full!"<<std::endl;
return false;
}
rear = (rear+1)%max_size;
arry[rear] = t;
if(front == -1)
front++;
return true;
}
template <class T> T Queue<T>::Delete() {
int qCount = abs(rear-front)+1;
if(rear == front && qCount != max_size)//隊中只有一個元素,直接變空佇列
{
T tmp = arry[front];
front = -1;
rear = -1;
return tmp;
}
front = (front+1)%max_size;//不止一個元素
return arry[front];
}
template <class T> void Queue<T>::Destroy() {
delete []arry;
}
template <class T> void Queue<T>::Traverse() {
if(front == -1)
{
std::cout<<"queue is empty!"<<std::endl;
return;
}
int f = front;
int r = rear;
while(f != r)
{
std::cout<<arry[(f++)%max_size]<<std::endl;
}
std::cout<<arry[f]<<std::endl;
}
int main() {
Queue<int> q(3);
q.Insert(1);
q.Insert(2);
q.Insert(3);
q.Traverse();
q.Delete();
q.Delete();
q.Delete();
q.Traverse();
system("pause");
return 0;
}