您的位置:首页 > 其它

动态数组实现循环队列

2012-07-20 20:56 489 查看
vs2008运行正确,如有误,请各位大牛指正!

代码:

// DQueue.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
/*动态数组实现循环队列:少用一个空间,队尾指针的下一位是队头指针时为满
队头、队尾初始值:front = rear = 0;
队头:总是指向第一个结点
队尾:总是指向最后一个结点的下一位
队空:front == rear
队满:(rear+1)%Max==front 或不存在队满,动态增加内存
入队: data[(rear++)%Max]= NewItem;
出队:NewItem = data[(front++)%Max];
*/
#include <iostream>
using namespace std;
const int QueueIncreMent=10;
template<class Type>
class Queue
{
public:
Queue(int maxSize = 20);
~Queue();
Queue(const Queue<Type>& otherQueue);
Queue<Type> operator=(const Queue<Type>& otherQueue);
void initQueue();
bool isEmptyQueue() const;
bool IsFullQueue() const;;
void destoryQueue();
void enQueue(Type newItem);
void deQueue(Type& newItem);
int lengthQueue();
private:
Type* data;
int front;
int rear;
int maxSize;//队列的最大空间
};

template<class Type>
Queue<Type>::Queue(int maxSize)
{
this->maxSize = maxSize;
data = new Type[maxSize];
front = 0;
rear = 0;
}

template<class Type>
Queue<Type>::~Queue()
{
if (data != NULL)
{
destoryQueue();
}
}

template<class Type>
Queue<Type>::Queue(const Queue<Type>& otherQueue)
{
if (!otherQueue.isEmptyQueue())
{
this->maxSize = otherQueue.maxSize;
data = new Type[maxSize];
front = otherQueue.front;
rear = otherQueue.rear;
memcpy(data,otherQueue.data,maxSize);
}
}

template<class Type>
Queue<Type> Queue<Type>::operator=(const Queue<Type>& otherQueue)
{
if (this!=&otherQueue)
{
if (!otherQueue.isEmptyQueue())
{
if (maxSize!=otherQueue.maxSize)
{
maxSize = otherQueue.maxSize;
delete[] data;
data = new Type[maxSize];
}
front = otherQueue.front;
rear = otherQueue.rear;
memcpy(data,otherQueue.data,maxSize);
}
}
return *this;
}

template<class Type>
void Queue<Type>::initQueue()
{
destoryQueue();
}

template<class Type>
bool Queue<Type>::isEmptyQueue() const
{
return (rear == front);
}

template<class Type>
bool Queue<Type>::IsFullQueue() const
{
return ((rear+1)%maxSize == front);
}

template<class Type>
void Queue<Type>::destoryQueue()
{
delete[] data;
data = NULL;  //注意此步
front = 0;
rear = 0;
}

template<class Type>
void Queue<Type>::enQueue(Type newItem)
{
if (IsFullQueue())
{
maxSize = maxSize+QueueIncreMent;
Type *newdata = new Type[maxSize];
memcpy(newdata,data,maxSize);
delete data;
data = newdata;
}
else
{
data[(rear++)%maxSize] = newItem;
}
}

template<class Type>
void Queue<Type>::deQueue(Type& newItem)
{
if (isEmptyQueue())
{
cout<<"队列空!"<<endl;
}
else
{
newItem = data[(front++)%maxSize];
}
}

template<class Type>
int Queue<Type>::lengthQueue()
{
return ((rear-front+maxSize)%maxSize);
}

int _tmain(int argc, _TCHAR* argv[])
{
Queue<char> queue1;
Queue<char> queue2;
char a[4] = {'1','2','3','4'};
for (int i=0; i<4; i++)
{
queue1.enQueue(a[i]);
}
queue2 = queue1;
Queue<char> queue3(queue2);
for (int i=0; i<4; i++)
{
char b;
queue3.deQueue(b);
cout<<b<<" ";
}
cout<<endl;
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: