队列(顺序存储)C++模板实现
队列:一端进行插入,另一端进行删除的线性结构,具有先进先出性。利用数组来实现队列将面临“假溢出”的情况,如下图所示:
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(); //打印队内元素 }
运行结果:
posted on 2014-04-09 16:57 xiaogua918 阅读(577) 评论(0) 编辑 收藏 举报