循环队列C++实现

队列特点:先进先出

队列类型:普通队列,环形队列

普通队列

特点:出队时,队列头前面元素用不了,容易浪费空间

环形队列

特点:队列头,队列尾都在变化

相关代码

MyQueue.h

#ifndef MYQUEUE_H
#define MYQUEUE_H
/********************************/
/*环形队列C++实现*/
/********************************/

class MyQueue
{
public:
	MyQueue(int queueCapacity);  //InitMyQueue(&Q)创建队列
	virtual ~MyQueue();          //DestroyQueue(&Q)销毁队列
	void ClearQueue();           //ClearEmpty(Q)清空队列
	bool QueueEmpty() const;    //QueueEmpty(Q)判空队列
	bool QueueFull() const;    //QueueFull(Q)判满队列
	int QueueLength() const;	//QueueLength(Q)队列长度
	bool EnQueue(int element);  //EnQueue(&Q,element)新元素入队
	bool DeQueue(int &element);  //DeQueue(&Q,&element)首元素出队
	void QueueTraverse();        //QueueTraverse(Q,visit())遍历队列
private:
	int *m_pQueue;    //队列数组指针
	int m_iQueueLen;  //队列元素个数
	int m_iQueueCapacity;  //队列数组容量
	int m_iHead;   //队列头
	int m_iTail;   //队列尾
};


#endif MYQUEUE_H

MyQueue.cpp

#include "MyQueue.h"
#include <iostream>
using namespace std;
MyQueue::MyQueue(int queueCapacity)
{
	m_iQueueCapacity = queueCapacity;
	m_pQueue = new int[m_iQueueCapacity];
	ClearQueue();
}

MyQueue::~MyQueue()
{
	delete[]m_pQueue;
	m_pQueue = nullptr;
}

void MyQueue::ClearQueue()
{
	m_iHead = 0;
	m_iTail = 0;
	m_iQueueLen = 0;
}

bool MyQueue::QueueEmpty() const
{
	return m_iQueueLen ? false : true;
}

bool MyQueue::QueueFull() const
{
	return m_iQueueCapacity == m_iQueueLen ? true : false;
}

int MyQueue::QueueLength() const
{
	return m_iQueueLen;
}

bool MyQueue::EnQueue(int element)
{
	if (QueueFull())
	{
		return false;
	}
	else 
	{
		m_pQueue[m_iTail] = element;
		m_iTail = (m_iTail + 1) % m_iQueueCapacity; 
		m_iQueueLen++;
		return true;
	}
	
}

bool MyQueue::DeQueue(int & element)
{
	if (QueueEmpty()) {
		return false;
	}
	else {
		element = m_pQueue[m_iHead];
		m_iHead = (m_iHead + 1) % m_iQueueCapacity;
		m_iQueueLen--;
		return true;
	}
}

void MyQueue::QueueTraverse()
{
	for (int i = m_iHead; i < m_iQueueLen+m_iHead;i++ ) 
	{
		//i < m_iQueueLen+m_iHead  代表要循环m_iQueueLen
		cout << m_pQueue[i%m_iQueueCapacity] << endl;  
		//cout << "前面还有" << (i - m_iHead) << "" << endl;
	}

	/*
	之前错误代码
		for (int i = m_iHead; i != m_iTail;i = (i+1)%m_iQueueCapacity )
	{
		cout << m_pQueue[i] << endl;
	}

	*/
}

demo.cpp

#include <iostream>
#include <stdlib.h>
#include"MyQueue.h"
using namespace std;
int main(void) {
	MyQueue *p = new MyQueue(4);
	p->EnQueue(10);
	p->EnQueue(12);
	p->EnQueue(16);
	p->EnQueue(18);
	//p->EnQueue(20);
	
	p->QueueTraverse();

	cout << endl;
	int e = 0;
	p->DeQueue(e);
	cout << e << endl;
	p->DeQueue(e);
	cout << e << endl;
	cout << endl;
	p->QueueTraverse();

	cout << endl;
	p->ClearQueue();
	p->QueueTraverse();

	cout << endl;
	p->EnQueue(3);
	p->EnQueue(20);
	p->QueueTraverse();


	delete p;
	p = NULL;
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xgy123xx/article/details/89076757