队列如果使用链式存储结构则很容易实现,但是队列一般用于对大量数据进行频繁的入队和出队操作,若采用链式存储结构,则要频繁对内存进行分配和去配操作,开销很大,效率很低,因此如果要频繁的入队或出队操作时,链式结构是不合适的,而采用顺序存储结构的循环队列则很好的解决了这个问题。
MyQueue.h
#pragma once
class MyQueue
{
public:
MyQueue(int items);//参数items为打算存放的数据量
virtual ~MyQueue();
bool EnQueue(int data);
bool DeQueue(int* pRecvData=nullptr);
void DeTraverse();//遍历队列中存储的数据元素
int GetSize();//获取队列中的数据量
bool IsFull();
bool IsEmpty();
private:
int* pArr;
int head,tail;
int length;//队列的实际长度
};
MyQueue.cpp
#include "MyQueue.h"
#include <iostream>
using namespace std;
MyQueue::MyQueue(int items)
{
this->length = items + 1;//必须多开辟一个空间,因为尾指针要指向这个空间
pArr = new int[this->length];
head = tail = 0;
}
MyQueue::~MyQueue()
{
delete[]pArr;
}
bool MyQueue::EnQueue(int data)
{
if (IsFull())
{
cout<<"队列已满!"<<endl;
return false;
}
pArr[tail] = data;
tail = (tail + 1) % length;
return true;
}
bool MyQueue::DeQueue(int* pRecvData)
{
if (IsEmpty())
{
cout << "队列为空!" << endl;
return false;
}
if (pRecvData != nullptr)
*pRecvData = pArr[head];
head = (head+1) % length;
return true;
}
int MyQueue::GetSize()
{
return (tail - head + length) % length;
}
bool MyQueue::IsFull()
{
return (tail + 1) % length == head;
}
bool MyQueue::IsEmpty()
{
return head == tail;
}
void MyQueue::DeTraverse()
{
if (head == tail)
{
cout << "队列为空!" << endl;
return;
}
for (int i = head; i != tail; i = (i + 1) % length)
cout << pArr[i] << " ";
cout << endl;
}
main.cpp(测试代码)
#include <iostream>
using namespace std;
#include "MyQueue.h"
int main()
{
MyQueue que(5);
cout<<"que的数据量为:" <<que.GetSize()<< endl;
que.EnQueue(1);
que.EnQueue(2);
que.EnQueue(3);
que.EnQueue(4);
que.EnQueue(5);
que.DeQueue();
que.EnQueue(6);
cout << "que的数据量为:" << que.GetSize() << endl;
que.DeTraverse();
//que.DeQueue();
//cout << "que的数据量为:" << que.GetSize() << endl;
//que.DeTraverse();
//que.DeQueue();
//que.DeQueue();
//que.DeQueue();
//que.DeQueue();
//que.DeQueue();
//que.EnQueue(5);
//cout << "que的数据量为:" << que.GetSize() << endl;
getchar();
return 0;
}