IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 顺序队列和链队列(Queue模板) -> 正文阅读

[游戏开发]顺序队列和链队列(Queue模板)

目录

模板:相关讲解

一、队列

1.定义:

2.储存方式:

3.基本操作:

二、判断顺序队列队满的三种方法

三、基本操作:?

1.声明

????????2.初始化数据? ?

????????3.入队?

????????4.出队

????????5.判断队满和队空

????????6.获得栈顶元素

????????7.清空队列

?????????8.显示队列数据

四、模板(自制)?

1.顺序队列

2.链队列


模板:相关讲解

一、队列

1.定义:

只允许在一端进行插入操作,而另一端进行删除 操作的线性表。

顺序队列

?链队列

??

2.储存方式:

顺序储存和链式储存

3.基本操作:


? ?1)? ?CirQueue(int m_size): 建立长度为size的队列
? ?2)? bool enQueue(T item): 入队
? ?3)? bool deQueue(T* item): 出队
? ?4)? bool getFront(T* item): 读取队头元素,但不删除
? ?5)? bool isEmpty(): 判断队列是否为空
? ?6)? bool isFull(): 判断队列是否为满(如果是链队列就不需要判断)
? ?7)? void clearQueue(): 清空队列
? ?8)void displayQueue() : 显示队列内容
? ?9)int queueLength(): 获取队列元素个数

二、判断顺序队列队满的三种方法

方法一:附设一个存储队列中元素个数的变量num,num=0时队空,当num=QueueSize时为队满;(这也是我喜欢采用的方式,还可以记录队列个数,在获取队列元素个数时比较方便)?

方法二:修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元;

方法三:设置标志flag,front=rearflag=0时为队空,当front=rearflag=1时为队满。

三、基本操作:?

1.声明:

? 顺序队列:

const int Queuesize = 100;
template <class T>
class CirQueue
{
private ://顺序队列
	T* data;
	int front;
	int rear;
	int num ;
	int m_Size;
public:
	CirQueue();                                  
	CirQueue(int m_size);//                      
	~CirQueue();                               
	bool enQueue(T item);				
	bool deQueue(T* item);            
	bool getFront(T* item);           
	bool isEmpty();                            
	bool isFull();                                 
	void clearQueue();                       
	void displayQueue();                   
	int queueLength();            
};

? 链队列:

template <class T>
struct Node//定义一个结构体含有 数据 和 指针
{
	T data;
	struct Node* next;
};

template <class T>
class LinkQueue
{
private :
	int num;  //还是用来记录元素个数
	struct Node<T>* front;
	struct Node<T>* rear;
public:
	LinkQueue();                                                       
	~LinkQueue();                               
	bool enQueue(T item);				
	bool deQueue(T* item);            
	bool getFront(T* item);           
	bool isEmpty();                                                         
	void clearQueue();                       
	void displayQueue();                   
	int queueLength();            
};

?比较:其实变化不大,链队列不再设置队列长度,不用判断队列是否队满。

2.初始化数据? ?

顺序队列:

template<class T>
CirQueue<T>::CirQueue(int Size)
{
	num = 0;
	front = rear = -1;
	data = new T[Size];
	m_Size = Size;
}

链队列:?

template<class T>
LinkQueue<T>::LinkQueue()
{
	num = 0;
	front = new Node<T>;
	front->next = NULL;
	rear = front;
}

3.入队?

顺序队列:

template<class T>
bool CirQueue<T>::enQueue(T item)
{
	if (isFull()) return 0;
	else
	{
		rear = (rear  + 1)%m_Size ;
		data[rear] = item;
		num++;
		return 1;
	}
}

链队列:

template<class T>
bool LinkQueue<T>::enQueue(T item)
{
	struct Node<T> *s = new struct Node<T>;
	s->data = item;
	s->next = NULL;
	rear->next = s;
	rear = s;
	num++;
	return 1;
}

?4.出队

因为设定的是bool类型,所以要获得出队列的数据,需要通过一个指针,来去除出对的数据

顺序队列:

template<class T>
bool CirQueue<T>::deQueue(T* item)
{
	if (isEmpty()) return 0;
	else
	{
		front = (front + 1) % m_Size;
		*item = data[front];
		num--;
		return 1;	
	}
}

链队列:

?当时最后一个数据时

if (p->next == NULL)//只有一个元素(边界情况)
?? ??? ??? ?rear = front;

template<class T>
bool LinkQueue<T>::deQueue(T* item)
{
	if (isEmpty()) return 0;
	else
	{
		struct Node<T>* p;
		p = front->next;
		*item = p->data;
        front->next = p->next;
		if (p->next == NULL)//只有一个元素(边界情况)
			rear = front;
		delete p;
		num--;
		return 1;	
	}
}

5.判断队满和队空

?顺序队列:

? ? 此时就用到初始定义其用的 num,如果num = 0,代表队列里没有数据,无法出队和获得队首数据。如果num = m_Size,说明队列满了,不能再进队了。

template<class T>
bool CirQueue<T>::isEmpty()
{
	if (num == 0) return 1;
	else return 0;
}

template<class T>
bool CirQueue<T>::isFull()
{
	if (num == m_Size) return 1;
	else return 0;
}

链队列:

template<class T>
bool LinkQueue<T>::isEmpty()
{
	if (num == 0) return 1;
	else return 0;
}

?6.获得栈顶元素

顺序队列:

template<class T>
bool CirQueue<T>::getFront(T* item)
{
	int i;
	if (isEmpty()) return 0;
	i = (front+1)%m_Size;
	*item = data[i];
	return 1;
}

链队列:?

template<class T>
bool LinkQueue<T>::getFront(T* item)
{

	if (isEmpty()) return 0;
	*item = (front->next)->data;
	return 1;
}

?7.清空队列

顺序队列:

template<class T>
void CirQueue<T>::clearQueue()
{
	delete[]data;
}

链队列:

template<class T>
void LinkQueue<T>::clearQueue()
{

	while (front!= NULL)
	{
		struct Node<T>* p = front->next;
		front->next = p->next;
		if (p->next == NULL)//只有一个元素(边界情况)
			rear = front;
		delete p;
		num--;
	}
	
}

?8.显示队列数据

顺序链表:

template<class T>
void CirQueue<T>::displayQueue()
{
	int i = (front + 1) % m_Size;
	cout << "队列从队首到队尾数据依次为:" << endl;
	for ( ; i < m_Size; i++)
	{
		cout << " " << data[i]<<" " << endl;
	}
}

链队列:

template<class T>
void LinkQueue<T>::displayQueue()
{
	struct Node<T>*p = front->next;
	cout << "队列从队首到队尾数据依次为:" << endl;
	while(p)
	{
		cout << " " << p->data <<" " << endl;
		p = p->next;
	}
}

四、模板(自制)?

1.顺序队列

#include<iostream>
using namespace std;
const int Queuesize = 100;
template <class T>
class CirQueue
{
private:
	T* data;
	int front;
	int rear;
	int num;
	int m_Size;
public:
	CirQueue();
	CirQueue(int m_size);
	~CirQueue();
	bool enQueue(T item);
	bool deQueue(T* item);
	bool getFront(T* item);
	bool isEmpty();
	bool isFull();
	void clearQueue();
	void displayQueue();
	int queueLength();
};
template<class T>
CirQueue<T>::CirQueue(int Size)
{
	num = 0;
	front = rear = -1;
	data = new T[Size];

	m_Size = Size;
}
template<class T>
CirQueue<T>::~CirQueue()
{
	clearQueue();
    delete front;
}

template<class T>
bool CirQueue<T>::enQueue(T item)
{
	if (isFull()) return 0;
	else
	{
		rear = (rear + 1) % m_Size;
		data[rear] = item;
		num++;
		return 1;
	}
}

template<class T>
bool CirQueue<T>::deQueue(T* item)
{
	if (isEmpty()) return 0;
	else
	{
		front = (front + 1) % m_Size;
		*item = data[front];
		num--;
		return 1;
	}
}

template<class T>
bool CirQueue<T>::getFront(T* item)
{
	int i;
	if (isEmpty()) return 0;
	i = (front + 1) % m_Size;
	*item = data[i];
	return 1;
}

template<class T>
bool CirQueue<T>::isEmpty()
{
	if (num == 0) return 1;
	else return 0;
}

template<class T>
bool CirQueue<T>::isFull()
{
	if (num == m_Size) return 1;
	else return 0;
}

template<class T>
void CirQueue<T>::clearQueue()
{
	delete[]data;
}

template<class T>
void CirQueue<T>::displayQueue()
{
	int i = (front + 1) % m_Size;
	cout << "队列从队首到队尾数据依次为:" << endl;
	for (; i <m_Size; i++)
	{
		cout << " " << data[i] << " " << endl;
	}
}
template<class T>
int CirQueue<T>::queueLength()
{
	return num;
}

int main()
{
	int n;
	int x = 0;
	int temp = 0;
	int count = 0;
	CirQueue<int> p1(9);
	int i = 0;
	for (; i < 9; i++)
	{
		p1.enQueue(i + 1);//入队
		//cout << "上一个数据是"<< x << endl;
	}
	n = p1.getFront(&temp);//获得队首元素
	cout << "队首数据是:" << temp << endl;
	n = p1.deQueue(&temp);//出队
	cout << "出对后的队列长度:" << p1.queueLength() << endl;//出对后的队列长度
	p1.displayQueue();//显示队列数据
	return 0;
}

? ? ? ? 结果:

??

2.链队列

#include<iostream>
using namespace std;
//const int Queuesize = 100;
template <class T>
struct Node
{
	T data;
	struct Node* next;
};

template <class T>
class LinkQueue
{
private :
	int num;
	struct Node<T>* front;
	struct Node<T>* rear;
public:
	LinkQueue();                                                       
	~LinkQueue();                               
	bool enQueue(T item);				
	bool deQueue(T* item);            
	bool getFront(T* item);           
	bool isEmpty();                                                         
	void clearQueue();                       
	void displayQueue();                   
	int queueLength();            
};
template<class T>
LinkQueue<T>::LinkQueue()
{
	num = 0;
	front = new Node<T>;
	front->next = NULL;
	rear = front;
}
template<class T>
LinkQueue<T>::~LinkQueue()
{
	clearQueue();
}

template<class T>
bool LinkQueue<T>::enQueue(T item)
{
	struct Node<T> *p = new struct Node<T>;
	p->data = item;
	p->next = NULL;
	rear->next = p;
	rear = p;
	num++;
	return 1;
}

template<class T>
bool LinkQueue<T>::deQueue(T* item)
{
	if (isEmpty()) return 0;
	else
	{
		struct Node<T>* p;
		p = front->next;
		*item = p->data;
		if (p->next == NULL)//只有一个元素(边界情况)
			rear = front;
		else
		{
			front->next = p->next;
		}
		delete p;
		num--;
		return 1;	
	}
}

template<class T>
bool LinkQueue<T>::getFront(T* item)
{

	if (isEmpty()) return 0;
	*item = (front->next)->data;
	return 1;
}

template<class T>
bool LinkQueue<T>::isEmpty()
{
	if (num == 0) return 1;
	else return 0;
}
template<class T>
void LinkQueue<T>::clearQueue()
{

	while (front!= NULL)
	{
		struct Node<T>* p = front->next;
		front->next = p->next;
		if (p->next == NULL)//只有一个元素(边界情况)
			rear = front;
		delete p;
		num--;
	}
	
}

template<class T>
void LinkQueue<T>::displayQueue()
{
	struct Node<T>*p = front->next;
	cout << "队列从队首到队尾数据依次为:" << endl;
	while(p)
	{
		cout << " " << p->data <<" " << endl;
		p = p->next;
	}
}
template<class T>
int LinkQueue<T>::queueLength()
{
	return num;
}

int main()
{
	int n;
	int x = 0;
	int temp = 0;
	int count = 0;
	LinkQueue<int> p1;
	int i = 3;
	for (; i < 9; i++)
	{
		p1.enQueue(i + 1);//入队
		//cout << "上一个数据是"<< x << endl;
	}
	n = p1.getFront(&temp);//获得队首元素
	cout << "队首数据是:" << temp << endl;
	n = p1.deQueue(&temp);//出队
	cout << "出对后的队列长度:" << p1.queueLength() << endl;//出对后的队列长度
	p1.displayQueue();//显示队列数据
	return 0;
}

?结果:

思考:

约瑟夫问题?

约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

(文章创作不易,转载请声明,谢谢。文章仅仅是个人总结,如有错误,还请大佬指出,如果有什么不恰当的地方,也欢迎在评论区讨论)

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:53:59  更:2022-03-12 17:57:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 -2025/3/10 19:37:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码