用循环数组自定义队列

来源:互联网 发布:知敬畏守底线心得 编辑:程序博客网 时间:2024/06/07 02:26

用循环数组自定义队列

/*利用循环数组构建队列*/#ifndef _SEQ_QUEUE_H_#define _SEQ_QUEUE_H_template<class T>class SeqQueue{public:SeqQueue(int max = 10);//指定队列大小~SeqQueue();//析构bool isEmpty()const;//判断是否为空bool isFull()const;//判断是否队列已满int size()const;//返回队列元素个数T front()const;//返回队头元素,不删除T back()const;//返回队尾元素,不删除bool push(const T& t);//添加元素到队列void pop();//删除队首元素private:int maxSize;//记录队列最大数目int nowFront;//nowfront + 1就是目前的队头int nowRear;//队尾int nowSize;//目前大小T * array;//队列动态数组};#endiftemplate<class T>SeqQueue<T>::SeqQueue(int max = 10) :maxSize(max), nowFront(-1), nowRear(-1), nowSize(0){array = new T[max];}template<class T>SeqQueue<T>::~SeqQueue(){delete[] array;}template<class T>bool SeqQueue<T>::isEmpty()const{if (nowSize == 0)return true;elsereturn false;}template<class T>bool SeqQueue<T>::isFull()const{if (nowSize == maxSize)return true;elsereturn false;}template<class T>int SeqQueue<T>::size()const{return nowSize;}template<class T>T SeqQueue<T>::front()const{if (!isEmpty()){return array[nowFront + 1];}}template<class T>T SeqQueue<T>::back()const{if (!isEmpty())return array[nowRear];}template<class T>bool SeqQueue<T>::push(const T& t){if (isFull())return false;else{nowSize++;nowRear = (++nowRear) % maxSize;//++一定要在前面array[nowRear] = t;
return true;}}template<class T>void SeqQueue<T>::pop(){if (isEmpty())return;else{nowFront = (++nowFront) % maxSize;nowSize--;T t;array[nowFront] = t;//重置原来的元素,这样也许可以将智能指针引用减一。return;}}

测试代码:

#include <iostream>#include <memory>#include "SeqQueue.h"using namespace std;class A{public:A(){ cout << "A construct!" << endl; }~A(){ cout << "A destruct!" << endl; }};void testSeqQueue(){SeqQueue<shared_ptr<A>> mQueue;for (int i = 0; i < 12; i++){mQueue.push(make_shared<A>());mQueue.pop();cout << mQueue.size() << endl;}}void main(){testSeqQueue();system("pause");}

测试结果:

A construct!
A destruct!
0
A construct!
A destruct!
0
A construct!
A destruct!
0
A construct!
A destruct!
0
A construct!
A destruct!
0
A construct!
A destruct!
0
A construct!
A destruct!
0
A construct!
A destruct!
0
A construct!
A destruct!
0
A construct!
A destruct!
0
A construct!
A destruct!
0
A construct!
A destruct!
0

0 0