用C++实现队列模板类

其他数据结构链接如下:

用C++实现栈的类模板-优快云博客

用C++实现队列模板类-优快云博客

用C语言实现链表-优快云博客

用C语言实现哈希表(散列表)-优快云博客

 数据结构二叉树C代码-优快云博客

队列:一个动态集合,插入操作称为入队,删除操作称为出队,特点是先进先出。

实现的代码如下:

#include <iostream>
#include <memory>

using namespace std;

template<typename T>
class MyQueue{

private:
	unsigned int iTail = 0;
	unsigned int iHead = 0;
	int iSize = 0;
	int iNum = 0;//记录队列中有效元素的位数
	T *pData;
	
public:
	MyQueue()=delete;//将默认构造函数删掉(或者将其声明到private属性也可以),用户调用MyQueue(int size)构造函数
	MyQueue(int size)
	{
		this->iSize = size; 
		pData = new T[size];
		for(int i = 0; i < size; i++)
		{
			pData[i] = 0;
		}
	}
	
	~MyQueue()
	{
		if(pData != nullptr)
		{
			delete pData;
		}
	}
	
	//重新设置队列大小,若是缩小队列长度可能会导致队列的头和尾指向的位置发生变化。
	void set_size(int size)
	{
		if(pData == nullptr)
		{
			pData = new T[size];
			this->iSize = size;
		}
		else
		{
			T* pTmpData = new T[size];
			if(size < this->iSize)
			{
				for(int i = 0; i < size; i++)
				{
					pTmpData[i] = pData[i];
				}
				if(iNum > size)
				{
					iNum = size;
				}
			}
			else
			{
				for(int i = 0; i < size; i++)
				{
					if(i < this->iSize)
					{
						pTmpData[i] = pData[i];
					}
					else
					{
						pTmpData[i] = 0;
					}
				}
			}
			this->iSize = size;
			delete pData;
			pData = pTmpData;
		}	
	}
	
	bool empty()
	{
		return iNum == 0;
	}
	
	bool full()
	{
		return iNum == iSize;
	}
	
	const int get_size()
	{
		return iSize;
	}
	
	const int get_head()//因为队列是先进先出,用两个变量分别记录其头和尾。因此插入一个元素iHead会递增(可能会超过iSize的总大小),不过其真实下标是iHead % iSize,tail亦是。
	{
		return iHead % iSize;
	}
	
	const int get_tail()
	{
		return iTail % iSize;
	}
	
	bool en_queue(T value)
	{
		if(full())
		{
			cout << "failed enqueue, queue is full" << endl;
			return false;
		}
		
		pData[iHead%iSize] = value;
		iHead++;
		iNum++;
		return true;
	}
	
	//注意get_queue和de_queue的区别
	bool get_queue(T &Value)
	{
		if(empty())
		{
			cout << "failed get_queue, queue is empty" << endl;
			return false;
		}
		
		Value = pData[iTail%iSize];
		return true;
	}
	
	bool de_queue(T &Value)
	{
		bool ret = get_queue(Value);
		if(ret)
		{
			iTail++;
			iNum--;
		}
		return ret;
	}
	
};

int main()
{
	MyQueue<int> _queue(10);
	cout << "queue size " << _queue.get_size() << endl;
	
	for(int i = 0; i < 11; i++)
	{
		_queue.en_queue(i);
	}
	
	for(int i = 0; i < 11; i++)
	{
		int iValue;
		if(_queue.de_queue(iValue))
		{
			cout << "iValue : " << iValue << endl;
		}
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值