震惊篇(一)——如何通过面向对象的思想实现环形队列

从今天开始写数据结构的博文了,为什么呢?作者还是一个小小的大学生,因为数据结构实在是晦涩难懂,所以想在课下总结一下,写的有点low勿喷撒。


今天我们通过类的思想来实现环形队列。

           首先谈一下什么是队列。在百度百科上是这样定义的:“队列是一种特殊的 线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。”
           队列之所以称做是一种数据结构,是因为他有规定的操作方法,即First In First Out(FIFO),先进先出,也就是我们日常生活中排队的思想。
           环形队列是一种特殊的队列,顾名思义,它是一个环状的,秩序记录头尾即可操作。他可以减少内存资源的浪费,是一种绿色方法。
           如果通过类的思想实现一个环形队列,那就需要考虑到它需要哪些成员变量、哪些成员函数。本次通过 数组来实现。
           下面通过代码来展示他的成员变量和成员函数:
class MyQueue
{
public:
	
	MyQueue(int queueCapacity);//构造函数,用于定义一个新的队列,并初始化队列
	
	virtual ~MyQueue();//析构函数用于清除占用的内存
	
	void ClearQueue();//将队列元素全部清空
	
	bool QueueEmpty() const;//用于判断队列是否为空
	
	bool QueueFull() const;//用于判断队列是否为满
	
	int QueueLength() const;//用于测量队列长度
	
	bool EnQueue(int element);//队列入列
	
	bool DeQueue(int &element);//队列处理
	
	void QueueTraverse();//队列遍历
private:
	
	int *m_pQueue;//队列指针,用于检索队列属性和方法
	
	int m_iQueueLen;//队列长度属性
	
	int m_iQueueCapacity;//队列容量属性
	
	int m_iHead;//队头位置
	
	int m_iTail;//队尾位置
};


相应的成员变量和成员函数就是以上。

先看一下成员变量:

为了便于操作,队列的头位置、尾位置需要记录。
需要一个队列指针用于检索成员变量和函数。
需要记录队列长度和队列上限。

对于成员函数:

创建队列、删除队列、入列、出列、遍历、判空判满、获取队列当前长度、清空队列,这些函数是基本的实现成员函数。

再看一下实际代码,具体实现方法:

#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;
	//指针指向null;
	m_pQueue = NULL;
}
//清除队列元素
void MyQueue::ClearQueue()
{
	m_iHead = 0;
	m_iTail = 0;
	m_iQueueLen = 0;
}

bool MyQueue::QueueEmpty() const
{
	if (m_iQueueLen == 0)
	{
		return true;
	}
	else
	{
		return false;
	}
	//return m_iQueueLen == 0 ? true : false;
}
bool MyQueue::QueueFull() const
{
	if (m_iQueueLen == m_iQueueCapacity)
	{
		return true;
	}
	else
	{
		return false;
	}
}

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

bool MyQueue::EnQueue(int element)
{
	if (QueueFull())
	{
		cout << "The queue is full! EnQueue failed!" << endl;
		return false;
	}
	else
	{
		m_pQueue[m_iTail] = element;
		m_iTail=(m_iTail++)%m_iQueueCapacity;
		m_iQueueLen++;
		return true;
	}
	
}
bool MyQueue::DeQueue(int &element)
{
	if (QueueEmpty())
	{
		cout << "DeQueue failed!The queue is empty!" << endl;
		return false;
	}
	else
	{
		element = m_pQueue[m_iHead];
		m_iQueueLen -- ;
		m_iHead = (m_iHead++) % m_iQueueCapacity;
		return true;
	}
}

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

1.创建队列时,通过构造函数传入队列上限,实例化一个队列,申请内存,将队列清空初始化。
2.删除队列时,通过析构函数释放内存。
3.清空队列,即将队头队尾初始化为起始位置,将队列长度置为0。
4.判空,即判断队列长度是否是0,是0为空,否则为非空。
5.判满,即判断队列长度是否为队列上限,是则满,否则非满。
6.入列,出列,遍历要注意队列长度、队头队尾索引大小的逻辑问题,这里请各位自行理解代码。


结束啦啦啦啦啦啦啦~请多多支持~~~~~~~~~~~





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值