1. 程式人生 > >鏈佇列的基本操作(C++)

鏈佇列的基本操作(C++)

#pragma once
//===================鏈隊===================
/*鏈佇列是基於連結串列實現的佇列:連結串列頭部為隊首,連結串列尾部為隊尾*/

template<typename T>
struct QueueNode
{
	T value;
	QueueNode<T> *next;

	struct QueueNode(T x) :value(x), next(nullptr){};
};

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

	bool isEmpty();
	int size();
	bool mypop();
	void mypush(T t);
	T front();

private:
	QueueNode<T> *phead;
	QueueNode<T> *pend;
	int count;
};

template<typename T>
LinkQueue<T>::LinkQueue()
{
	phead = new QueueNode<T>(0);
	pend = phead;
	count = 0;
}


template<typename T>
LinkQueue<T>::~LinkQueue()
{
	while (phead->next != nullptr)
	{
		QueueNode<T> *tmpNode = phead;
		phead = phead->next;
		delete tmpNode;
	}
}

template<typename T>
bool LinkQueue<T>::isEmpty()
{
	return count == 0;
}

template<typename T>
int LinkQueue<T>::size()
{
	return count;
}

//隊尾插入
template<typename T>
void LinkQueue<T>::mypush(T t)
{
	QueueNode<T> *tmpNode = new QueueNode<T>(t);
	pend->next = tmpNode;
	pend = tmpNode;
	count++;
}

//在隊首刪除
template<typename T>
bool LinkQueue<T>::mypop()
{
	if (count == 0)
	{
		cout << "空隊" << endl;
		return false;
	}
	else
	{
		QueueNode<T> *tmpNode = phead->next;
		phead->next = phead->next->next;
		delete tmpNode;
		return true;
	}
}

//獲取隊首元素
template<typename T>
T LinkQueue<T>::front()
{
	if (count == 0)
	{
		cout << "空隊" << endl;
		return false;
	}
	else
		return	 phead->next->value;
}


int main()
{
	//==========鏈隊===========
	LinkQueue<int> *lqueue = new LinkQueue<int>();
	int n;
	while (cin >> n)
		lqueue->mypush(n);

	cout << "佇列大小:" << lqueue->size() << endl;
	while (!lqueue->isEmpty())
	{
		cout << lqueue->front() << " ";
		lqueue->mypop();
	}

	cout << endl;
}