用c++基于模板实现的可设置容量的队列(Queue)
程序员文章站
2022-07-14 14:19:20
...
环境介绍
- 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;
}
下一篇: 双端队列 ADT接口 数组实现