您的位置:首页 > 理论基础 > 数据结构算法

数据结构——链式队列模板类实现

2017-10-14 21:24 666 查看
数据结构笔记3.3.3 Queue

与栈类似,队列也分成顺序队列和链式队列。用单链表表示的链式队列特别适合于元素变动比较大的情形,而且不存在队列FULL而溢出的情况。另外,假若程序中需要多个队列,与多个栈的情形一样,最好使用链式队列。这样不会出现存储分配不合理的问题,也不需要考虑存储的移动。下面就给出相应的代码。

链式队列模板类代码:

//数据结构——链式队列模板类
#include <iostream>
using namespace std;
template<class T>
struct LinkNode {
T data;                 //队列每个节点的数据域
LinkNode<T> *next;      //队列每个节点的指针域
//构造函数
LinkNode(T x, LinkNode<T> *p = NULL) {
data = x;
next = p;
}
};
template<class T>
class LinkedQueue {
public:
LinkedQueue();                          //构造函数
~LinkedQueue();                            //析构函数
bool enQueue(const T & x);              //将x加入队列当中
bool delQueue(T & x);                   //删除队头元素,x返回其值
bool getFront(T & x) const;             //查看队头元素的值
void makeEmpty();                       //将队列清空
bool isEmpty() const;                   //判断队列是否为NULL
int getSize() const;                    //返回队列元素的个
4000
数
void output(ostream & out);             //输出队列元素,由重载运算符函数调用
private:
LinkNode<T> *front, *rear;              //队头、队尾指针
};

//函数定义
template<class T>
LinkedQueue<T>::LinkedQueue() {
//构造函数,初始化队头和队尾指针
front = rear = NULL;
}

template<class T>
void LinkedQueue<T>::makeEmpty() {
//置空队列,释放链表中的所有节点
LinkNode<T> *current;
while (front != NULL) {
current = front;
front = front->next;
delete current;
}
}

template<class T>
bool LinkedQueue<T>::enQueue(const T & x) {
//元素x进入队尾
if (NULL == front) {
//如果是空队列,直接用指针开辟节点
front = rear = new LinkNode<T>(x);
if (NULL == front) {
//分配内存失败返回false
return false;
}
}
else {
rear->next = new LinkNode<T>(x);
if (NULL == rear->next) {       //直接用rear的next开辟新节点
return false;
}
rear = rear->next;              //更新尾指针
}
return true;
}

template<class T>
bool LinkedQueue<T>::delQueue(T & x) {
//如果队列不是NULL,删除队头节点,函数返回true,否则返回false
if (isEmpty()) {                    //队列为空,出队失败
return false;
}
LinkNode<T> *Del = front;
x = front->data;
front = front->next;
delete Del;
return true;
}

template<class T>
bool LinkedQueue<T>::getFront(T & x)const {
//若队列不为NULL,函数返回队头元素的值和true,否则返回false
if (isEmpty()) {
return false;
}
x = front->data;
return true;
}

template<class T>
int LinkedQueue<T>::getSize()const {
//函数返回队列元素的个数
LinkNode<T> *p = front;
int queueEleAmount = 0;
while (p != NULL) {
queueEleAmount++;
p = p->next;
}
return queueEleAmount;
}

template<class T>
bool LinkedQueue<T>::isEmpty() const {
//判断队列是否为NULL并返回true,否则返回false
if (front == NULL) {
return true;
}
else {
return false;
}
}

template<class T>
LinkedQueue<T>::~LinkedQueue() {
//析构函数,释放程序中的资源
makeEmpty();
}

template<class T>
void LinkedQueue<T>::output(ostream & out) {
//输出队列中的元素,被重载<<函数调用
LinkNode<T> *current = front;
while (current != NULL) {
out << current->data << " ";
current = current->next;
}
cout << endl;
}

template<class T>
ostream & operator << (ostream & out, LinkedQueue<T> &LQ) {
//重载<<运算符函数,调用output实现队列的输出
LQ.output(out);
return out;
}


Main函数测试代码:

int main()
{
LinkedQueue<int> link_queue;
link_queue.enQueue(1);              //入队测试
link_queue.enQueue(2);
link_queue.enQueue(3);
link_queue.enQueue(4);
link_queue.enQueue(5);
cout << link_queue;
int del_value1, del_value2;
link_queue.delQueue(del_value1);    //出队测试
link_queue.delQueue(del_value2);
cout << link_queue;
int queue_head = 0;
link_queue.getFront(queue_head);    //读取队头测试
cout << queue_head << endl;
link_queue.makeEmpty();             //set NULL test
if (link_queue.isEmpty()) {
cout << "Queue is null" << endl;
}
cout << link_queue.getSize() << endl;//返回队列元素个数测试

system("pause");
return 0;
}


运行效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: