该文章主要介绍队列的链式存储结构以及相关运算。
头文件:LinkQueue.h
template <typename T>
struct LinkNode //链队数据结点类型
{
T data; //结点数据域
LinkNode *next; //指向下一个结点
};
template <typename T>
struct LinkQueue //链队结点类型
{
LinkNode<T> *front; //指向队头结点
LinkNode<T> *rear; //指向队尾结点
};
template <typename T>
class LinkQueueClass //链队类模板
{
LinkQueue<T> *Q; //链队结点Q
public:
//=================链队基本运算算法============================
LinkQueueClass(); //构造函数
~LinkQueueClass(); //析构函数
bool QueueEmpty(); //判断队列是否为空
void enQueue(T e); //进队算法
bool deQueue(T &e); //出队算法
};
源文件:LinkQueue.cpp
#include <iostream>
#include "LinkQueue.h"
//=================链队基本运算算法============================
template <typename T>
LinkQueueClass<T>::LinkQueueClass() //构造函数
{
Q = new LinkQueue<T>();
Q->front = NULL;
Q->rear = NULL;
}
template <typename T>
LinkQueueClass<T>::~LinkQueueClass() //析构函数
{
LinkNode<T> *pre = Q->front, *p;
if (pre != NULL)
{
if (pre == Q->rear)
delete pre;
else
{
p = pre->next;
while (p != NULL)
{
delete pre;
pre = p;
p = p->next;
}
delete pre;
}
delete Q;
}
}
template <typename T>
bool LinkQueueClass<T>::QueueEmpty() //判断队列是否为空
{
return(Q->rear == NULL);
}
template <typename T>
void LinkQueueClass<T>::enQueue(T e) //进队算法
{
LinkNode<T> *p = new LinkNode<T>();
p->data = e;
p->next = NULL;
if (Q->rear == NULL)
Q->front = Q->rear = p;
else
{
Q->rear->next = p;
Q->rear = p;
}
}
template <typename T>
bool LinkQueueClass<T>::deQueue(T &e) //出队算法
{
LinkNode<T> *p;
if (Q->rear == NULL)
return false;
p = Q->front;
if (Q->front == Q->rear)
Q->front = Q->rear = NULL;
else
Q->front = Q->front->next;
e = p->data;
delete p;
return true;
}
主函数:main.cpp
#include "LinkQueue.cpp"
using namespace std;
//=================链队基本运算算法======================
void main()
{
LinkQueueClass<char> lq; //定义一个字符链队lq
char e;
cout << "建立一个空队lq\n";
cout << "队lq" << (lq.QueueEmpty()?"空":"不空") << endl;
cout << "元素a进队\n"; lq.enQueue('a');
cout << "元素b进队\n"; lq.enQueue('b');
cout << "元素c进队\n"; lq.enQueue('c');
cout << "元素d进队\n"; lq.enQueue('d');
cout << "元素e进队\n"; lq.enQueue('e');
cout << "队lq" << (lq.QueueEmpty()?"空":"不空") << endl;
cout << "所有元素出队次序:";
while (!lq.QueueEmpty()) //队不空循环
{
lq.deQueue(e); //出队元素e
cout << e << " "; //输出元素e
}
cout << endl;
cout << "销毁队lq" << endl;
}