数据结构-什么是队列?

简介

队列是计算机科学中一种重要的线性数据结构,它遵循先进先出(FIFO - First In First Out)的原则。队列的原理和现实生活中的排队现象是一样的,比如你在超市买了菜排队去结账,刚来的人只能在队尾排着,在队列中叫入队,结完账的人走出去,在队列中叫出队。

队列在计算机系统中有着广泛的应用,从操作系统的进程调度、磁盘I/O管理,到网络数据包传输、消息队列系统,再到算法中的广度优先搜索等,队列都扮演着不可或缺的角色。理解队列的原理和实现对于编写高效、可靠的程序至关重要。

一、队列的基本概念

队列是具有一定操作约束的线性表。具体的操作有以下:

插入和删除:只能在一端插入(队尾插入),另一端删除(队头删除)。

数据插入:入队列

数据删除:出队列

先进先出:FIFO,先来先服务

二、队列的抽象类型

操作集:长度为MaxSize的队列Q Queue,队列元素item ElementType

1.Queue CreatQueue(int MaxSize) //生成长度为MaxSize的空队列

2.int IsFullQ(Queue Q,int MaxSize) //判断队列Q是否已满

3.void AddQ(Queue Q,ElementType item) //将数据元素item插入队列Q中

4.int IsEmptyQ(Queue Q) //判断队列Q是否为空

5.ElementType DeleteQ(Queue Q) //将队列数据元素从队列中删除并返回

三、什么是队列的顺序存储

队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front,及一个记录队列尾位置的变量rear组成。

这是一个顺序环状队列结构,如下图:

顺序环状队列的数据从尾部插入过程,如下图所示:

这里仅使用n-1个数组空间,便于判断队列状态是否空或满。

四、顺序循环队列实现

4.1 数据结构定义

复制代码
#define MaxSize  //存储元素的最大个数
struct Qnode
{
	ElementType Data[MaxSize];
	int rear;
	int front;
};
typedef struct Qnode *Queue;

4.2 入队列

复制代码
void AddQ(Queue Q,ElementType item)
{
	if((Q->rear+1)%MaxSize == Q->front)	//队列满
	{
		printf("队列满\r\n");
		return;
	}
	
	Q->rear = (Q->rear+1)%MaxSize;
	Queue->Data[Q->rear] = item;
}

4.3 出队列

复制代码
ElementType DeleteQ(Queue Q)
{
	if(Q->rear == Q->front)
	{
		printf("队列空\r\n");
		return;
	}
	
	Q->front = (Q->front+1)%MaxSize;
	return Q->Data[Q->front];
}

五、队列的链式存储实现

队列的链式存储结构也可以用一个单链表实现。插入和删除操作分别在链表的两头进行,队列指针front和rear应该分别指向链表哪一头呢?

4.1 定义

复制代码
struct Node
{
	ElementType Data;
	struct *Next;
};

struct QNode				//链队列结构
{
	struct Node *rear;		//指向队尾结点
	struct Node *front;		//指向对头节点
};
typedef struct QNode *Queue;
Queue PtrQ;

队列的链式存储结构,入下图所示:

4.2 不带头结点的链式队列出队操作示例

复制代码
ElementType DeleteQ(Queue PtrQ)
{
	struct Node *FrontCell;
	ElementType FrontElem;
	
	if(PtrQ->front == NULL)
	{
		printf("队列空");
		return ERROR;
	}
	
	FrontCell = PtrQ->front;
	if(PtrQ->front == PtrQ->rear)				//若队列只有一个元素
	{
		PtrQ->front = PtrQ->rear = NULL;		//删除后队列置位空
	}
	else
	{
		PtrQ->front = PtrQ->front->Next;
	}
	
	FrontElem = FrontCell->Data;
	free(FrontCell->Data);						//释放被删除的结点空间
	return FrontElem;
}

六、总结

数据队列的概念理解起来并不是很难,重要的时理解了基本概念之后,一定要去运用,只有实际应用了才能真正的懂。

队列的应用无非是初始化、数据插入、数据删除这几步操作,应用其实倒是蛮简单的。

相关推荐
ulias2121 小时前
leetcode热题 - 5
数据结构·算法·leetcode
如何原谅奋力过但无声1 小时前
【灵神高频面试题合集04-05】二分查找
数据结构·python·算法·leetcode
我不是懒洋洋1 小时前
【数据结构】排序算法(直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序)
c语言·数据结构·c++·经验分享·算法·排序算法
辛苦才能1 小时前
数据结构--排序--插入排序(C语言,重点排序面试和比赛都会考察)
c语言·数据结构·面试
qeen8716 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码17 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
我星期八休息17 小时前
IT疑难杂症诊疗室:AI时代工程师Superpowers进化论
linux·开发语言·数据结构·人工智能·python·散列表
漂流瓶jz17 小时前
UVA-1152 和为0的4个值 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·二分查找·题解·aoapc·算法竞赛入门经典·uva
你撅嘴真丑18 小时前
map 与 set容器的应用--话题焦点人物
数据结构
生成论实验室18 小时前
《事件关系阴阳博弈动力学:识势应势之道》第二篇:阴阳博弈——认知的动力学基础
数据结构·人工智能·科技·神经网络·算法