一、实验内容要求
1.建立以不带头结点的循环链表表示的队列,只设置一个指向队尾结点的指针
2.对已建立的循环链队列进行入队、出队、查看队头元素等基本操作
二、代码
#include <iostream>
using namespace std;
//定义结构体
template <class DataType>
struct Node
{
int data; /*原来虚类型(占位符名称)是DataType,未指定具体数据类型,编译会报错,
又因为在main函数中我们构造的是int型的链队列,故在这里将其改为 int data */
Node<DataType> * next;
};
//定义模板类
template <class DataType>
class CirLinkQueue
{
public:
CirLinkQueue();
~CirLinkQueue();
void EnQueue(DataType x);
DataType DeQueue();
DataType GetQueue();
int Empty();
private:
Node <DataType> * rear;
};
//类中成员函数定义
template<class DataType>
CirLinkQueue<DataType>::CirLinkQueue() //循环链队列初始化
{
rear = NULL;
}
template<class DataType>
CirLinkQueue<DataType>::~CirLinkQueue() //析构操作
{
Node<DataType> *p = NULL;
while (rear != NULL) {
p = rear->next;
rear->next = p->next;
delete p;
}
}
template<class DataType>
void CirLinkQueue<DataType>::EnQueue(DataType x) //将元素x入队(空队列、非空队列插入操作语句一致)
{
Node<DataType> * s = NULL;
s = new Node<DataType>;
s ->data = x;
if(rear == NULL)
{
rear = s;
rear->next = s;
}else
{
s->next = rear->next;
rear->next = s;
rear = s;
}
}
template<class DataType>
DataType CirLinkQueue<DataType>::DeQueue() //出队操作
{
Node<DataType> * p = NULL; //队头结点
DataType x; //队头数据域
if (rear == NULL) //若为空队列
{
throw"下溢"; //抛出异常,终止函数执行
}
p = rear->next; x = p->data; //暂存队头元素
if(rear == p) //若队列只有一个元素
{
rear = NULL; //尾指针空置
}else{ //若队列有多个元素
rear->next = p->next; //将队头元素所在结点摘链
}
delete p; //出队
return x; //返回出队的元素的值
}
template<class DataType>
DataType CirLinkQueue<DataType>::GetQueue() //取队头操作
{
if(rear != NULL) //若非空队列
{
return rear->next->data;
}else
{
throw"下溢"; //抛出异常,终止函数执行
}
}
template<class DataType>
int CirLinkQueue<DataType>::Empty() //判空操作
{
if(rear == NULL) //若为空队列
{
return 1; //让程序异常退出,也就是函数非正常终止
}else
{
return 0; //程序正常退出
}
}
//主函数
int main()
{
int x;
CirLinkQueue<int> Q;
if(Q.Empty())
{
cout << "队列为空" << endl;
}else
{
cout << "队列非空" << endl;
}
cout << "元素6,7,8,13执行入队操作:" << endl;
Q.EnQueue(6);
Q.EnQueue(7);
Q.EnQueue(8);
Q.EnQueue(13);
cout << "查看队头元素:" << endl;
cout << Q.GetQueue() << endl;
cout << "出队操作:" << endl;
try{
x = Q.DeQueue();
cout << "执行一次出队操作,出队元素是:" << x << endl;
}
catch(char * str)
{
cout << str << endl;
}
cout << "查看队头元素:" << endl;
cout << Q.GetQueue() << endl;
}
三、实验结果