C++循环队列

队列如果使用链式存储结构则很容易实现,但是队列一般用于对大量数据进行频繁的入队和出队操作,若采用链式存储结构,则要频繁对内存进行分配和去配操作,开销很大,效率很低,因此如果要频繁的入队或出队操作时,链式结构是不合适的,而采用顺序存储结构的循环队列则很好的解决了这个问题。
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;
}

猜你喜欢

转载自blog.csdn.net/csdn_gddf102384398/article/details/82999599