您的位置:首页 > 编程语言 > C语言/C++

队列(顺序存储)C++模板实现

2014-04-09 16:57 519 查看
队列:一端进行插入,另一端进行删除的线性结构,具有先进先出性。利用数组来实现队列将面临“假溢出”的情况,如下图所示:

front:永远指向队首元素,队首在本文中是允许删除元素的一端

rear:永远指向队尾元素,队尾在本文中是允许插入元素的一端



所以引出循环队列,循环队列简单来说就是当rear=n时,将rear指针修改为0。



上图可形象为下图:



#include <iostream>
using namespace std;

template <typename T>
class Queue{
private:
int front; //指向队列首元素
int rear; //指向队列尾元素的下一个地址
int maxSize; //队列最大长度
T *data; //保存队列元素的数组空间
int num; //队列中的元素个数
public:
Queue(int max=10):maxSize(max){  //构造函数,初始化队列
front=0;
rear=0;
num=0;
data = new T[maxSize];
}
~Queue(){
delete [] data;  //释放队列空间
}
void In(T x);  //向队列插入一个元素
void Out();    //队尾元素出队
T getFront() const;  //获得队首元素
int getLength() const; //当前队列元素个数
bool isFull() const;  //判断队列是否已满
bool isEmpty() const; //判断队列是否为空
void printAll() const; //打印队内元素
};

template <typename T>
void Queue<T>::In(T x){  //队尾插入一个元素
data[rear]=x;
rear=(rear+1)%maxSize;
num++;
}

template <typename T>
void Queue<T>::Out(){   //队首元素出队
front=(front+1)%maxSize;
num--;
}

template <typename T>
T Queue<T>::getFront() const{  //获得队首元素
return data[front];
}

template <typename T>
int Queue<T>::getLength()const{ //当前队列元素个数
return num;
}

template <typename T>
bool Queue<T>::isFull()const{  //判断队列是否已满
return num==maxSize;
}

template <typename T>
bool Queue<T>::isEmpty()const{ //判断队列是否为空
return num==0;
}

template <typename T>
void Queue<T>::printAll() const{
int p = front;
int i=1;
while(p!=rear){
cout<<"第"<<i<<"元素:"<<data[p]<<endl;
i++;
p = (p+1)%maxSize;
}
}

void main(){
Queue<int> *a = new Queue<int>(5);
cout<<"队列是否为空:"<<a->isEmpty()<<endl;  //判断队列是否为空,如果返回1则为空
a->In(1);  //队尾插入一个元素值为1
a->In(2);	//队尾插入一个元素值为2
a->In(3);	//队尾插入一个元素值为3
a->In(4);	//队尾插入一个元素值为4
a->In(5);	//队尾插入一个元素值为5
cout<<"队列是否已满:"<<a->isFull()<<endl;  //判断队列是否已满,如果返回1则表示队列已满
cout<<"队列元素个数:"<<a->getLength()<<endl;
a->Out();   //队首元素出队
cout<<"队列元素个数:"<<a->getLength()<<endl<<endl;
a->printAll();  //打印队内元素
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息