1. 队列的定义
队列是一种特殊的线性表,它包含一个队头(front)和一个队尾(rear),其中队头只允许删除元素,队尾只允许插入元素。队列的特定是先进入队列的元素先出来,即先进先出(FIFO)。出队列时,只有当前面的元素都退出之后,后面的元素才能退出。
图 队列示意图
2. 队列的操作
队列的主要操作有下面6种:
(1)InitQueue(&Q):初始化操作,独立一个空队列Q。
(2)QueueEmpty(Q):若Q为空队列,返回1,否则返回0。
(3)EnterQueue(&Q,x):插入元素X到队列Q的队尾。
(4)DeleteQueue(&Q,&e):删除Q的队首元素,并用e返回其值。
(5)Gethed(Q,&e):用e返回Q的队首元素。
(6)ClearQueue(&Q):将队列Q清空。
3. 队列的顺序存储
队列有两种存储方式:顺序存储和链式存储。采用顺序存储结构的队列称为顺序队列,采用链式存储结构的队列称为链式队列。
链式队列通常采用一维数组进行存储。其中,连续的存储单元一次存放队列中的元素。同时,使用两个指针分别表示数组中存放的第一个元素和最后一个元素的位置。其中,指向第一个元素的位置指针称为队头指针front,指向最后一个元素位置的指针称为队尾指针rear。
顺序队列的类型定义如下:
#define QueueSize 40 /* 队列的容量 */
typedef struct Squeue{
DataType queue[QueueSize];
int front,rear; /* 队头指针和队尾指针 */
}SeqQueue;
顺序队列会出现“真溢出”和“假溢出”现象。所谓“真溢出”是指插入元素已超过分配的存储空间,不能再继续插入元素;而“假溢出”是指队尾指针已经达到数组的尾端,而队头指针之前有删除元素后留下的剩余空间,这是经过多次插入和删除操作引起的,像这种有存储空间而不能再进行插入元素操作的溢出称为“假溢出”。
图 假溢出示意图
为了避免顺序队列造成“假溢出”现象,通常采用顺序循环队列来实现队列的顺序存储。为了充分利用存储空间,消除“假溢出”现象,就是当队尾指针rear和队头指针front到达存储空间的最大值QueueSize时,让队尾指针和队头指针自动转化为存储空间的最小值0。这样就把顺序队列使用的存储空间构造成一个逻辑上首尾相连的循环队列。注意:顺序循环队列中的入队操作和出队操作都要取模,确保操作不出界。
图 顺序循环队列
4. 队列的链式存储
为了避免顺序队列在进行插入和删除操作时大量移动元素,可以采取链式存储结构表示队列。一个链式队列通常采用链表实现。其中,链表包括两个域:数据域和指针域。数据域用来存放队列中的元素,指针域用来存放队列中下一个元素的地址。同时,使用两个指针分别指示链表中存放的第一个元素和最后一个元素的位置。其中,指向第一个元素位置的指针称为队头指针front,指向最后一个元素的位置的指针称为队尾指针rear。
链式队列的类型定义如下:
/* 节点类型定义 */
typedef struct QNode
{
DataType data;
struct QNode* next;
}LQNode, *QueuePtr;
/* 队列类型定义 */
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
图 链式队列示意图
5. 双端队列
双端队列是一种特殊的队列,它是在线性表的两端对插入和删除操作限制的线性表。双端队列可以再队列的任何一端进行插入和删除操作,而一般的队列要求在一端插入元素,另一端删除元素。
输入受限的双端队列:线性表的两端都可以输出数据元素,但是只能在一端输入数据元素。
输出受限的双端队列:线性表的两端都可以输入数据元素,但是只能在一端输出数据元素。
图 双端队列示意图
分享到:
相关推荐
消息队列基础.pdf
消息队列基础知识,对消息队列的简单介绍,简单的入门知识
栈和队列,了解栈和队列的定义 。 掌握顺序栈和链栈上的基本运算算法的实现。 掌握顺序队列和链队列上的基本运算算法的实现。 能灵活运用栈和队列解决实际应用问题
消息队列基础知识,对消息队列的简单介绍,简单的入门知识。
编写一个程序,实现链队列的各种基本运算,并在基础上完成以下功能: 1) 初始化链队列; 2) 判断链队列是否为空; 3) 依次进队元素a,b,c; 4) 出队一个元素,并输出该元素; 5) 输出链队列的长度; 6) 依次进队元素d,...
1、介绍ActiveMQ5.x消息队列基础特性和本地快速安装 2、SpringBoot2.x整合ActiveMQ实战之点对点消息
C语言实现队列,测试功能完整,可以在作为基础库开发。 包含接口:Queue_Init、Queue_Free、Queue_AddToHead、Queue_AddToTail、Queue_GetFromHead、Queue_GetFromTail、OnQueueIncreasedEvent
实验三 栈和队列 3.1实验目的: (1) 熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现; (2) 熟悉队列的特点(先进先出)及队列的基本操作...
栈和队列(基础知识,单项选择题,填空题,简答题,程序)
4.通常,队列采用的是先进先出的(FIFO)的存储缓冲机制,也就是往队列中发送数据的时候(也叫入队)永远都是发送到队列的尾部,而从队列中提取数据的时候(也叫出队)是从队列的头部提取的。 5.发送数据和读取数据...
RabbitMQ实战 高效部署分布式消息队列 基础及运维操作实操
算法-理论基础- 队列- 循环队列(包含源程序).rar
本人自己做的类,虽说只是测试版,但已经可以胜任一部分任务了 PS:双向队列是基础类,单调队列、单调栈是结果类
大学数据结构,循环队列及其例子,基础基础基础中的基础
循环队列的基本操作和实现循环队列的基本操作和实现
双端队列,在基础类上派生 用来实现平移递推滤波数据存储
对于棧和队列部分的基础运用,你需要进行系统的基础复习,和对于小程序的实现
队列的上级实验,算法使用C语言解答,能够学到一些基础的队列的插入删除操作
基础题 ⑴编写链接队列的基本操作函数。 ①进队操作 EnQueue(QUEUE **head,QUEUE **tail,int x) ②出队操作,队空 DeQueue(QUEUE **head,QUEUE **tail,int *cp) ③输出队列中元素 OutputQueue(QUEUE *head) ⑵...