数据结构---队列

一. 使用数组

(1)队列定义

队列图示
空队列

队列是一种受限制的线性结构

只允许在表的前端(front)进行删除操作, 而在表的后端(rear)进行插入操作

(2)顺序存储实现

在这里插入图片描述
入队
在这里插入图片描述
满队列

1.元素类型

#define MaxSize 5         //最大容量
typedef int DataType;    //元素类型

typedef struct Queue
{
	DataType queue[MaxSize];

	int front;
	int rear;
}SeqQueue;

2.判断队列

判断队列状态, front等于rear表示当前队列为空
rear为最大值时,表示状态为满


/*是否为空*/
int IsEmpty(SeqQueue* SQ)
{
	if (!SQ) return 0;
	if (SQ->front == SQ->rear)
	{
		return 1;
	}
	return 0;
}

/*是否为满*/
int IsFull(SeqQueue* SQ)
{
	if (!SQ) return 0;
	if (SQ->rear == MaxSize)
	{
		return 1;
	}
	return 0;
}

3.初始化队列

置空即可

void InitQueue(SeqQueue *SQ)
{
	if (!SQ) return;
	SQ->front = SQ->rear = 0;
}

4.元素插入

/*入队*/
int EnterQueue(SeqQueue* SQ, DataType data)
{
	if (!SQ) return 0;
	if(IsFull(SQ))
	{
		cout << "队列已满" << endl;
		return 0; 
	}

	SQ->queue[SQ->rear] = data;
	SQ->rear++;
	return 1;
}

5.遍历

/*遍历数组*/
void PrintQuere(SeqQueue* SQ)
{
	if (!SQ) return;

	int i = SQ->front;
	while (i<SQ->rear)
	{
		cout << SQ->queue[i] << "\t";
		i++;
	}
	cout << endl;
}

6.删除

① 删除 front 所指的元素, 后面所有元素前移 1 并返回被删除元素

两个元素的队列,删除A1,A2左移,rear-1
在这里插入图片描述

删除一个元素后
在这里插入图片描述

代码实现

/*出队,第一种方式,后面元素向前移动*/
int DeleteQueue(SeqQueue* SQ)//, DataType data)
{
	if (!SQ || IsEmpty(SQ))
	{
		cout << "队列为空!" << endl;
		return 0;
	}

	//data = SQ->queue[SQ->front];

	for (int i = SQ->front + 1; i <= SQ->rear; ++i)
	{
		SQ->queue[i - 1] = SQ->queue[i];
	}

	SQ->rear--;
	
}
② 删除 front 所指的元素,然后加 1 并返回被删元素

两个元素的队列,删除A1,front+1
在这里插入图片描述
删除一个元素后
在这里插入图片描述

代码实现

/*出队, 第二种方式, front后移一位,这会导致空间越来越小... */
int DeleteQueue2(SeqQueue* SQ)//,DataType data)
{
	if (!SQ || IsEmpty(SQ))
	{
		cout << "队列为空!" << endl;
		return 0;
	}

	if (SQ->front >= MaxSize) 
	{ 
		cout << "队列已到尽头!" << endl; 
		return 0; 
	}
	SQ->queue[SQ->front] = NULL;
	SQ->front++;

	return 1;
}

7.清空队列

//清空队列
void ClearQueue(SeqQueue* SQ)
{
	if (!SQ) return;
	SQ->front = SQ->rear = 0;
}

8.获取队列元素个数

//获取队列中元素的个数
int getLength(SeqQueue* SQ)
{
	if (!SQ) return 1;
	SQ->front = SQ->rear = 0;
}

使用数组实现队列完整代码

#include <iostream>

using namespace std;

#define MaxSize 5         //最大容量
typedef int DataType;    //元素类型

typedef struct Queue
{
	DataType queue[MaxSize];

	int front;
	int rear;
}SeqQueue;

//初始化
void InitQueue(SeqQueue *SQ)
{
	if (!SQ) return;
	SQ->front = SQ->rear = 0;
}

/*遍历数组*/
void PrintQuere(SeqQueue* SQ)
{
	if (!SQ) return;

	int i = SQ->front;
	while (i<SQ->rear)
	{
		cout << SQ->queue[i] << "\t";
		i++;
	}
	cout << endl;
}

/*是否为空*/
int IsEmpty(SeqQueue* SQ)
{
	if (!SQ) return 0;
	if (SQ->front == SQ->rear)
	{
		return 1;
	}
	return 0;
}

/*是否为满*/
int IsFull(SeqQueue* SQ)
{
	if (!SQ) return 0;
	if (SQ->rear == MaxSize)
	{
		return 1;
	}
	return 0;
}

/*入队*/
int EnterQueue(SeqQueue* SQ, DataType data)
{
	if (!SQ) return 0;
	if (IsFull(SQ))
	{
		cout << "队列已满" << endl;
		return 0;
	}

	SQ->queue[SQ->rear] = data;
	SQ->rear++;

	return 1;
}
/*出队,第一种方式,后面元素向前移动*/
int DeleteQueue(SeqQueue* SQ)//, DataType data)
{
	if (!SQ || IsEmpty(SQ))
	{
		cout << "队列为空!" << endl;
		return 0;
	}

	//data = SQ->queue[SQ->front];

	for (int i = SQ->front + 1; i <= SQ->rear; ++i)
	{
		SQ->queue[i - 1] = SQ->queue[i];
	}

	SQ->rear--;
	return 1;
}
/*出队, 第二种方式, front后移一位,这会导致空间越来越小... */
int DeleteQueue2(SeqQueue* SQ)//,DataType data)
{
	if (!SQ || IsEmpty(SQ))
	{
		cout << "队列为空!" << endl;
		return 0;
	}

	if (SQ->front >= MaxSize) 
	{ 
		cout << "队列已到尽头!" << endl; 
		return 0; 
	}
	SQ->queue[SQ->front] = NULL;
	SQ->front++;

	return 1;
}

//清空队列
void ClearQueue(SeqQueue* SQ)
{
	if (!SQ) return;
	SQ->front = SQ->rear = 0;
}

int main()
{
	SeqQueue* SQ = new SeqQueue;
	//DataType data;

	//初始化
	InitQueue(SQ);
	
	//入队
	int i;
	for (i=0; i < 5; i++) {
		if (EnterQueue(SQ, i))
		{
			cout << "插入成功" << endl;
		}
		else
		{
			cout << "插入失败" << endl;
		}
	}

	cout << "队列元素:";
	PrintQuere(SQ);

	//DeleteQueue(SQ);
	cout << "删除队列front指向的元素:";
	DeleteQueue2(SQ);
	cout << "剩下的队列元素:";
	PrintQuere(SQ);


	return 0;
}

二. 使用链式

队列的链式存储结构,其实就是线性表的单链表,只不过它只是尾进头出而已,我们把它简称为链队列。为了 操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点
在这里插入图片描述

1.元素类型

#define MaxSize 5  //最大容量
typedef int DataType;

typedef struct _QNode
{
	DataType data;
	struct _QNode* next;
}QNode;

typedef QNode* QueuePtr;

typedef struct Queue
{
	int length;     //队列的长度
	QueuePtr front; //队头指针
	QueuePtr rear;  //队尾指针
}LinkQueue;

2.队列初始化

在这里插入图片描述
空的队列

void InitQueue(LinkQueue* LQ)
{
	if (!LQ) return;

	LQ->length = 0;
	LQ->front = LQ->rear = nullptr;
}

3.插入元素

在这里插入图片描述
插入一个元素,有些区别,需要单独处理
在这里插入图片描述
插入第二个元素

//判断队列为空 
int IsEmpty(LinkQueue *LQ) 
{ 
	if(!LQ) return 0;
	if (LQ->front == NULL)
	{ 
		return 1; 
	}
	return 0; 
}
//判断队列是否为满 
int IsFull(LinkQueue *LQ) 
{ 
	if(!LQ) return 0; 
	if (LQ->length == MaxSize) 
	{ 
		return 1; 
	}
	return 0; 
}
//入队
int EnterQueue(LinkQueue* LQ, DataType data)
{
	if (!LQ) return 0;

	if (IsFull(LQ))
	{
		cout << "无法插入元素" << data << ", 队列已满" << endl;
	}

	QNode* qNode = new QNode;
	qNode->data = data;
	qNode->next = NULL;

	if (IsEmpty(LQ))
	{
		LQ->front = LQ->rear = qNode;
	}
	else
	{
		LQ->rear->next = qNode;
		LQ->rear = qNode;
	}
	LQ->length++;

	return 1; 
}

4.删除元素

在这里插入图片描述
出列后不存在其他元素,rear也置空
在这里插入图片描述
rear不用清空

int DeleteQueue(LinkQueue *LQ)//,DateType *date)
{
	QNode* tmp = NULL;

	if (!LQ || IsEmpty(LQ))
	{
		cout << "队列为空" << endl;
		return 0;
	}

	tmp = LQ->front;
	LQ->front = tmp->next;
	if (!LQ->front) LQ->rear = NULL;//出队后不存在其他元素,将rear也置空

	LQ->length--;

	return 1;
}

完整代码

#include <iostream>
#define MaxSize 5
using namespace std;

typedef int DataType;

typedef struct _QNode
{
	DataType data;
	struct _QNode* next;
}QNode;

typedef QNode* QueuePtr;
 
typedef struct Queue
{
	int length;     //队列的长度
	QueuePtr front; //队头指针
	QueuePtr rear;  //队尾指针
}LinkQueue;

void InitQueue(LinkQueue* LQ)
{
	if (!LQ) return;

	LQ->length = 0;
	LQ->front = LQ->rear = nullptr;
}
//判断队列为空 
int IsEmpty(LinkQueue *LQ) 
{ 
	if(!LQ) return 0;
	if (LQ->front == NULL)
	{ 
		return 1; 
	}
	return 0; 
}
//判断队列是否为满 
int IsFull(LinkQueue *LQ) 
{ 
	if(!LQ) return 0; 
	if (LQ->length == MaxSize) 
	{ 
		return 1; 
	}
	return 0; 
}
int EnterQueue(LinkQueue* LQ, DataType data)
{
	if (!LQ) return 0;

	if (IsFull(LQ))
	{
		cout << "无法插入元素" << data << ", 队列已满" << endl;
		return 0;
	}

	QNode* qNode = new QNode;
	qNode->data = data;
	qNode->next = NULL;

	if (IsEmpty(LQ))
	{
		LQ->front = LQ->rear = qNode;
	}
	else
	{
		LQ->rear->next = qNode;
		LQ->rear = qNode;
	}
	LQ->length++;

	return 1; 
}

int DeleteQueue(LinkQueue *LQ)//,DateType *date)
{
	QNode* tmp = NULL;

	if (!LQ || IsEmpty(LQ))
	{
		cout << "队列为空" << endl;
		return 0;
	}

	tmp = LQ->front;
	LQ->front = tmp->next;
	if (!LQ->front) LQ->rear = NULL;//出队后不存在其他元素,将rear也置空

	LQ->length--;

	return 1;
}

// 打印
void PrintQueue(LinkQueue* LQ)
{
	QueuePtr tmp;
	if (!LQ) return; if (LQ->front == NULL) 
	{
		cout << "队列为空!"; return;
	}

	tmp = LQ->front; 
	while (tmp)
	{
		cout  << tmp->data << " "; 
		tmp = tmp->next;
	}
	cout << endl;
}
//清空队列
void ClearQueue(LinkQueue* LQ)
{
	if (!LQ) return;

	while (LQ->front) 
	{
		QueuePtr tmp = LQ->front->next; 
		delete LQ->front;
		LQ->front = tmp;
	}

	LQ->front = LQ->rear = NULL; 
	LQ->length = 0;
}

int main(void)
{
	LinkQueue* LQ = new LinkQueue; 
	//DataType data = -1;

	//初始化队列
	InitQueue(LQ);

	//入队
	for (int i = 0; i < 7; i++) 
	{
		if (EnterQueue(LQ, i))
		{
			cout << "插入成功" <<endl;
		}
		else 
		{
			cout << "插入失败" << endl;
		}
	}
	cout << "当前值为:" << endl;
	PrintQueue(LQ);
	
	//出队
	if (DeleteQueue(LQ))
	{
		cout << "出队后:" << endl;
		PrintQueue(LQ);
	}else
	{
		cout << "出队失败" << endl;
	}
	ClearQueue(LQ);
	delete LQ;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值