1. 程式人生 > >C++迴圈佇列

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;
}