队列(数据结构)【详解】

目录

一、队列的基本概念

1.队列的定义

2.队列的基本操作

二、队列的顺序存储结构

1.队列的顺序存储结构

2.基本操作

3.判断条件

 三、队列的链式存储结构

1.队列的链式存储

2.优点

四、双端队列

1.概述

2.分类


 

一、队列的基本概念

1.队列的定义

队列是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除,向队列中插入元素称为入队进队;删除元素称为出队离队

队列的特点先进先出

结构:

  • 队头(Front):允许删除的一端,又称队首;
  • 队尾(Rear):允许插入的一端;
  • 空队列:不含任何元素的空表

2.队列的基本操作

InitQueue(&Q):初始化 队列,构造一个空队列Q

QueueEmpty(Q):判队列空,若队列Q为空返回ture;否则返回false

EnQueue(&Q,x):入队,若队列Q未满,将x加入,使之成为新的队尾

DeQueue(&Q,x):出队,若队列Q非空,删除队头元素,并用x返回

GetHead(Q,&x):读队头元素,若队列Q非空,则将队头元素赋值给x

二、队列的顺序存储结构

1.队列的顺序存储结构

分配一块连续的存储单元存放队列中的元素,并附设两个指针:队头指针front指向队头元素,队尾指针rear指向队尾元素的下一个位置(具体问题具体分析)。

2.基本操作

初始时:Q.front=Q.rear=0

队首指针进1:Q.front=(Q.front+1)%MaxSize

队尾指针进1:Q.rear=(Q.rear+1)%MaxSize

队列长度:(Q.rear+MaxSize-Q.front)%MaxSize

3.判断条件

队空:Q.front==Q.rear

队满:

牺牲一个单元来区分队空和队满,即“队头指针在队尾指针的下一位置作为队满的标志”:

  1. 队满条件:(Q.rear+1)%MaxSize==Q.front;
  2. 队空条件:Q.front==Q.rear
  3. 队列中元素的个数:(Q.rear-Q.front+MaxSize)%MaxSize

类型中增设表示元素个数的数据成员:

  1. 队空:为Q.size==0;
  2. 队满:Q.size==MaxSize 

类型中增设tag数据成员,以区分是队满还是队空:

  1. tag等于0时,若因删除导致Q.front==Q.rear,则为队空;
  2. tag等于1时,若因插入导致Q.front==Q.rear,则为队满。

 三、队列的链式存储结构

1.队列的链式存储

队列的链式表示称为链队列,是一个同时带有队头指针和队尾指针的单链表

头指针指向对头结点

尾指针指向队尾结点

当Q.front==NULL且Q.rear==NULL时,链式队列为空

2.优点

适合于数据元素变动比较大的情形。

不存在队列满且产生溢出的问题。

四、双端队列

1.概述

双端队列是指允许两端都可以进行入队和出队操作的队列;

逻辑结构仍是线性结构

将队列的两端分别称为前端后端,两端都可以入队和出队。

2.分类

输出受限的双端队列:允许在一端进行插入和删除,但在另一端只允许插入的双端队列;

输入受限的双端队列:允许在一端进行插入和删除,但在另一端只允许删除的双端队列;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值