数据结构探险—队列篇(环形队列代码实现)

imooc相关学习视频.

环形队列代码实现
第一个测试代码
MyQueue.h–>定义环形队列相关功能接口和元素的头文件(存入的数据都是int类型)

#ifndef MYQUEUE_H_
#define MYQUEUE_H_
/*
 * 环形队列C++实现
 */
class MyQueue
{
public:
	MyQueue(int queueCapacity);  //InitQueue(&Q) 创建队列
	virtual ~MyQueue();          //DestroyQueue(&Q) 销毁队列
	void ClearQueue();           //ClearQueue(&Q) 清空队列
	bool QueueEmpty() const;     //QueueEmpty(Q) 判空队列
	int QueueLength() const;     //QueueLength(Q) 队列长度
	bool QueueFull() const;      //QueueFull(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 <iostream>
#include "MyQueue.h"

using namespace std;

MyQueue::MyQueue(int queueCapacity)
{
	m_iQueueCapacity = queueCapacity;
	m_pQueue = new int[m_iQueueCapacity]();
	MyQueue::ClearQueue();
}

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

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

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

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

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

bool MyQueue::EnQueue(int element)
{
	if (QueueFull()) {
		cout << "队列已满,无法再插入新元素!!!"<< endl;
		return false;
	} else {
		m_pQueue[m_iTail] = element;
		m_iTail++;
		m_iTail = m_iTail % m_iQueueCapacity;
		m_iQueueLen++;
		return true;
	}
}

bool MyQueue::DeQueue(int &element)
{
	if(QueueEmpty()) {
		cout << "队列为空,无法再删除元素!!!"<< endl;
		return false;
	} else {
		element = m_pQueue[m_iHead];
		m_iHead++;
		m_iHead = m_iHead % m_iQueueCapacity;
		m_iQueueLen--;
		return false;
	}
}

void MyQueue::QueueTraverse()
{
	for(int i = m_iHead; i < m_iQueueLen + m_iHead; i++) {
		cout << m_pQueue[i % m_iQueueCapacity] << endl;
	}
}

QueueDemo.cpp–>测试入口代码文件

#include <iostream>
#include "MyQueue.h"
using namespace std;

int main() {
	MyQueue* p = new MyQueue(4);
	p->EnQueue(10);
	p->EnQueue(12);
	p->EnQueue(14);
	p->EnQueue(16);
	p->EnQueue(18);
	p->QueueTraverse();

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

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

	delete[] p;
	p = NULL;
	return 0;
}

第二个测试代码
如果传入的数据不是int类型,而是一个对象的代码如下:
Customer.h–>对象相关的头文件信息

#ifndef CUSTOMER_H_
#define CUSTOMER_H_

#include <string>
using namespace std;

class Customer
{
public:
	Customer(string name="", int age=0);
	void printInfo() const;
private:
	string m_strName;
	int m_iAge;
};


#endif /* CUSTOMER_H_ */

Customer.cpp–>对象相关的实现类

#include<iostream>
#include "Customer.h"

using namespace std;
Customer::Customer(string name, int age)
{
	m_strName = name;
	m_iAge = age;
}

void Customer::printInfo() const
{
	cout << "姓名: " << m_strName << endl;
	cout << "年龄:" << m_iAge << endl;
	cout << endl;
}

MyQueue.h–>修改后的定义环形队列相关功能接口和元素的头文件(存入的数据都是Customer类型)

/*
 * 环形队列C++实现
 */
#include "Customer.h"

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

#endif /* MYQUEUE_H_ */

MyQueue.cpp–>修改后的实现环形队列相关功能代码

#include <iostream>
#include "MyQueue.h"

using namespace std;

MyQueue::MyQueue(int queueCapacity)
{
	m_iQueueCapacity = queueCapacity;
	m_pQueue = new Customer[m_iQueueCapacity];
	MyQueue::ClearQueue();
}

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

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

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

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

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

bool MyQueue::EnQueue(Customer element)
{
	if (QueueFull()) {
		cout << "队列已满,无法再插入新元素!!!"<< endl;
		return false;
	} else {
		m_pQueue[m_iTail] = element;
		m_iTail++;
		m_iTail = m_iTail % m_iQueueCapacity;
		m_iQueueLen++;
		return true;
	}
}

bool MyQueue::DeQueue(Customer &element)
{
	if(QueueEmpty()) {
		cout << "队列为空,无法再删除元素!!!"<< endl;
		return false;
	} else {
		element = m_pQueue[m_iHead];
		m_iHead++;
		m_iHead = m_iHead % m_iQueueCapacity;
		m_iQueueLen--;
		return false;
	}
}

void MyQueue::QueueTraverse()
{
	for(int i = m_iHead; i < m_iQueueLen + m_iHead; i++) {
		m_pQueue[i % m_iQueueCapacity].printInfo();
	}
}

QueueDemo.cpp–>修改后的测试入口代码文件

#include <iostream>
#include "MyQueue.h"
using namespace std;

int main() {
	MyQueue* p = new MyQueue(4);
	Customer c1("zhangsan", 20);
	Customer c2("lisi", 22);
	Customer c3("wangwu", 24);
	p->EnQueue(c1);
	p->EnQueue(c2);
	p->EnQueue(c3);
	p->QueueTraverse();
	
	delete[] p;
	p = NULL;
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值