欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

链式队列的实现

程序员文章站 2022-07-14 14:04:59
...

原文地址:https://wanqbin.xyz/2019/03/31/链式队列的实现-1/

写在前面

  链式队列是队列的链式存储结构表示。队列是操作受限的表,队列有队头和队尾,插入元素的一端称为队尾,删除元素的一端称为队头。这和一般排队的概念一样,后来的人排在队尾,首先对队头的人进行服务,对队头的人服务后,原当前队头后的人就排在了当前队头。新来的人排在队尾后,原队尾的人就不再是当前队尾了,新来的人就成了当前队尾。
  链式队列的队头指针指在队列的当前队头节点位置,队尾指针指在队列的当前队尾节点位置。不带头节点的链式队列,出队列时可直接删除头指针所指的节点,因此,链式队列不带头指针时更加方便。

1.链式队列节点类的定义和实现

template<class T>
class LinkQueue;

template<class T>
class QueueNode
{
	friend class LinkQueue<T>;
public:
	T data;
	QueueNode<T>(const T& item, QueueNode<T> *ptrNext = NULL);
	~QueueNode() {};

private:
	QueueNode<T> *next;
};

template<class T>
inline QueueNode<T>::QueueNode(const T & item, QueueNode<T>* ptrNext)
{
	this->data = item;
	this->next = ptrNext;
}

2.链式队列类的定义

template<class T>
class LinkQueue
{
public:
	LinkQueue();//构造函数
	~LinkQueue();//析构函数

	void insert(const T& item);//入队
	T delet();//出队
	T readFront() const;//读队头元素
	bool empty() const;//判断队列是否为空
	void clearQueue();//清空队列
	int getSize() const;//取队列长度
	void display() const;//输出队列元素

private:
	QueueNode<T> *front;//指向队头的指针
	QueueNode<T> *rear;//指向队尾的指针
	int size;
};

3.链式队列类的实现

template<class T>
inline LinkQueue<T>::LinkQueue()
{
	size = 0;
	front = rear = NULL;
}

template<class T>
inline LinkQueue<T>::~LinkQueue()
{
	clearQueue();
	front = rear = NULL;
}

template<class T>
inline void LinkQueue<T>::insert(const T & item)
{
	QueueNode<T> *new_node = new QueueNode<T>(item);
	if (rear != NULL)
	{
		rear->next = new_node;
	}
	rear = new_node;
	if (front == NULL)
	{
		front = new_node;
	}
	size++;
}

template<class T>
inline T LinkQueue<T>::delet()
{
	if (size == 0)
	{
		cout << "Queue is empty" << endl;
		exit(1);
	}
	T member = front->data;
	QueueNode<T> *p = front->next;
	delete front;
	front = p;
	size--;
	return member;
}

template<class T>
inline T LinkQueue<T>::readFront() const
{
	return front->data;
}

template<class T>
inline bool LinkQueue<T>::empty() const
{
	return (size==0);
}

template<class T>
inline void LinkQueue<T>::clearQueue()
{
	QueueNode<T> *p1, *p2;
	p1 = front;
	while (p1 != NULL)
	{
		p2 = p1;
		p1 = p1->next;
		delete p2;
	}
	size = 0;
}

template<class T>
inline int LinkQueue<T>::getSize() const
{
	return size;
}

template<class T>
inline void LinkQueue<T>::display() const
{
	QueueNode<T> *p = front;
	int i = 0;
	while (p != NULL)
	{
		cout << "第" << i << "号元素为:" << p->data << endl;
		i++;
		p = p->next;
	}
}

4.测试主函数

void test()
{
	LinkQueue<int> queue;
	for (int i = 0; i < 10; i++)
	{
		queue.insert(i * 10);
	}
	cout << "队列长度为:" << queue.getSize() << endl;
	queue.display();
	cout << "栈顶元素为:" << queue.readFront() << endl;
	for (int i = 0; i < 10; i++)
	{
		cout << "元素:" << queue.delet() << "被删除" << endl;
	}
	cout << "队列长度为:" << queue.getSize() << endl;
}

int main()
{
	test();
	system("pause");
	return EXIT_SUCCESS;
}void test()
{
	LinkQueue<int> queue;
	for (int i = 0; i < 10; i++)
	{
		queue.insert(i * 10);
	}
	cout << "队列长度为:" << queue.getSize() << endl;
	queue.display();
	cout << "栈顶元素为:" << queue.readFront() << endl;
	for (int i = 0; i < 10; i++)
	{
		cout << "元素:" << queue.delet() << "被删除" << endl;
	}
	cout << "队列长度为:" << queue.getSize() << endl;
}

int main()
{
	test();
	system("pause");
	return EXIT_SUCCESS;
}

输出结果如下:
[外链图片转存失败(img-05sgyqAN-1565276338751)(https://i.imgur.com/NmtLrOb.png)]