【数据结构】圆形结构——循环队列 - Go语言中文社区

【数据结构】圆形结构——循环队列


——————————————现在就是正文———————————————

一.介绍

       与之前写过的数据结构不同:【数据结构】线性结构——队列

       循环队列在空间利用上比线性队列更有效率。当队列中指针队尾指向最后一位时,指针队头可重新指向队列第一位,实现首尾相接。

                                                       

二.队列的数据集和操作集

       对于抽象数据类型来说,每一种数据结构都有自己的数据集以及操作集,队列的数据集通常是一个装载数据的容器(如线性表的数组、链表和循环队列等)再加上记录队列头和队列尾的容器。在C++的库文件里面,有一个专门用作于队列的库文件,头文件名为: #include <queue>,在主函数里使用时可以酱定义:std::queue<数据类型>  类名。当然,以下内容并未直接使用C++提供的库,而是本人自己写的一个简陋的队列代码,以下提供本人的数据集以及操作集:
      数据集采用vector,操作更为方便:

private:
	int Node_Front;
	int Node_Rear;
	int Node_Size;
	
private:
	std::vector<type> Queue;

       操作集因人而异,本人的操作集如下:

template<class type>
class CircularQueue
{
public:
	CircularQueue(int k);
	~CircularQueue();

public:
	bool enQueue(type value); //insert element
	bool deQueue(); //delete element
	int Front(); //return Queue* Front
	int Rear(); //return Queue* Back
	type Get_value(); //return Front value
	bool isEmpty(); 
	bool isFull();
}

三.代码分析

      3.1.数据集

            就是简单地初始化一下

template<class type>
CircularQueue<type>::CircularQueue(int k)
{
	Node_Front = Node_Rear = -1;
	Node_Size = k;
	Queue.resize(k);
}

template<class type>
CircularQueue<type>::~CircularQueue()
{

}

      3.2.压入数据

template<class type>
bool CircularQueue<type>::enQueue(type value) //insert element
{
	if (isFull())
		return false;

	if (isEmpty())
		Node_Front = 0;

	Node_Rear = (Node_Rear + 1) % Node_Size;
	Queue[Node_Rear] = value;
	return true;
	
}

        3.3.删除数据

template<class type>
bool CircularQueue<type>::deQueue() //delete element
{
	if (isEmpty())
		return false;

	if (isFull())
	{
		Node_Front = -1;
		Node_Rear = -1;
		return true;
	}

	Node_Front = (Node_Front + 1) % Node_Size;
	return true;
}

         3.4.返回头/尾指针所在位置

template<class type>
int CircularQueue<type>::Front() //return Queue* Front
{
	return Node_Front;
}

template<class type>
int CircularQueue<type>::Rear() //return Queue* Back
{
	return Node_Rear;
}

         3.5.队列是否为空/满

template<class type>
bool CircularQueue<type>::isEmpty()
{
	if (Node_Front == -1)
	{
		printf("The Queue is Empty!n");
		return true;
	}
	else
		return false;
}

template<class type>
bool CircularQueue<type>::isFull()
{
	if (((Node_Rear + 1) % Node_Size) == Node_Front)
	{
		printf("The Queue is Full!n");
		return true;
	}
	else
		return false;
}

         3.6.获取头指针所指的数据(后面的文章会用到)

template<class type>
type CircularQueue<type>::Get_value()
{
	return Queue[Node_Front];
}

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_41884002/article/details/107634613
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-12-11 18:09:03
  • 阅读 ( 1274 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢