一起来学习C++队列的模板实现

1、概念。
队列(Queue),队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

二、基本操作。
1.Append();
2.GetHead();
3.GetTail();
4.Pop();
5.GetSize();
6.IsEmpty();
7.GetItem(int nIndex);

三、示图。
入队:
在这里插入图片描述
出队:
在这里插入图片描述
四、实现。
1、定义类。

template<typename T>
class Queue
{
public:
	Queue();
	~Queue();

	void Append(T t);
	T GetHead();
	T GetTail();
	void Pop();
	int GetSize();
	bool IsEmpty();
	T GetItem(int nIndex);
private:
	T *m_pArr;
	int m_nSize;
};

2、关键成员实现。

template<typename T>
Queue<T>::Queue()
:m_nSize(0),
m_pArr(NULL)
{
	m_pArr = new T[100];//capacity
}

template<typename T>
Queue<T>::~Queue()
{
	if (m_pArr)
	{
		delete[] m_pArr;
		m_pArr = NULL;
	}
}

template<typename T>
void Queue<T>::Append(T t)
{
	m_pArr[m_nSize++] = t;
}

template<typename T>
T Queue<T>::GetHead()
{
	return m_pArr[0];
}

template<typename T>
T Queue<T>::GetTail()
{
	int n = m_nSize -1;
	if (n<0)
	{
		return T();
	}
	else
	{
		return m_pArr[n];
	}	
}

template<typename T>
void Queue<T>::Pop()
{
	int i = 0;
	m_nSize--;
	while (i++<m_nSize)
	{
		m_pArr[i - 1] = m_pArr[i];
	}
}

template<typename T>
int Queue<T>::GetSize()
{
	return m_nSize;
}

template<typename T>
bool Queue<T>::IsEmpty()
{
	return m_nSize == 0;
}


template<typename T>
T Queue<T>::GetItem(int nIndex)
{
	T temp;
	if (nIndex <0||nIndex >=m_nSize)
	{
		return temp;
	}
	return m_pArr[nIndex];
}

3、调用实现。

int main()
{
	struct Hunter
	{
		string name;
		int age;
		void SetData(const char* strName, int nAge)
		{
			name = strName;
			age = nAge;
		}
	};

	Queue<Hunter> *pQueue = new Queue<Hunter>;

	Hunter hunter0;
	hunter0.SetData("Gon", 12);
	pQueue->Append(hunter0);

	hunter0.SetData("Killua", 12);
	pQueue->Append(hunter0);

	hunter0.SetData("Kula", 17);
	pQueue->Append(hunter0);

	hunter0.SetData("Leiouli", 19);
	pQueue->Append(hunter0);

	bool IsEmpty = pQueue->IsEmpty();
	int nSize = pQueue->GetSize();
	Hunter head = pQueue->GetHead();
	Hunter tail = pQueue->GetTail();

	pQueue->Pop();

	head = pQueue->GetHead();

	Hunter temp = pQueue->GetItem(1);

	cin.get();
	return 0;
}

添加四元素,Pop()之前:
在这里插入图片描述
Pop()之后:
在这里插入图片描述
五、小结:
(1)进出队列方式"先进先出(FIFO, First-In-First-Out)"。
(2)只允许在队首Delete,在队尾进行Append

向前辈们学习
入门萌新,浅知拙见,若有斧正,不胜感激。^ - ^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值