队列的基本操作,不带头结点的循环链队列的基本操作(入队、出队、查看队头元素)(c++ 数据结构 实验四)

一、实验内容要求
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;
} 

三、实验结果
在这里插入图片描述

头结点链队列是一种使用链表实现的队列结构,每个节点包含一个数据元素和一个指向下一个节点的指针。头结点不存储数据,只用于方便操作。 基本操作包括: 1. 初始化队列:创建一个头结点,并将队头指针和队尾指针指向头结点。 2. 判断队列是否为空:判断队头指针和队尾指针是否相等,如果相等则队列为空。 3. 入队操作:创建一个新节点,并将数据元素存入节点中,将队尾指针指向新节点。 4. 出队操作:将队头指针指向头结点的下一个节点,返回队头节点的数据元素。 5. 取队头元素:返回队头节点的数据元素,但不改变队列状态。 以下是带头结点链队列基本操作的代码实现: ```c++ #include <iostream> using namespace std; // 定义链队列结点结构体 struct Node { int data; Node *next; }; // 定义带头结点链队列结构体 struct Queue { Node *front; // 队头指针 Node *rear; // 队尾指针 }; // 初始化队列 void initQueue(Queue &q) { q.front = q.rear = new Node; q.front->next = nullptr; } // 判断队列是否为空 bool isEmpty(Queue q) { return q.front == q.rear; } // 入队操作 void enQueue(Queue &q, int x) { Node *newNode = new Node; newNode->data = x; newNode->next = nullptr; q.rear->next = newNode; q.rear = newNode; } // 出队操作 int deQueue(Queue &q) { if (isEmpty(q)) { cout << "Queue is empty!" << endl; return -1; } Node *p = q.front->next; int x = p->data; q.front->next = p->next; if (q.rear == p) { q.rear = q.front; } delete p; return x; } // 取队头元素 int getFront(Queue q) { if (isEmpty(q)) { cout << "Queue is empty!" << endl; return -1; } return q.front->next->data; } int main() { Queue q; initQueue(q); cout << "Is queue empty? " << isEmpty(q) << endl; enQueue(q, 1); enQueue(q, 2); enQueue(q, 3); cout << "Front element: " << getFront(q) << endl; cout << "Dequeue element: " << deQueue(q) << endl; cout << "Front element: " << getFront(q) << endl; return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值