数据结构与算法4—队列

news2024/11/23 15:39:58

队列

队列的定义

  • 队列(Queue)也是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许删除的一端称为队头(front),允许插入的一端称为队尾(rear)。
  • 队列的修改是依先进先出的原则进行的。

 队列的基本操作

1.初始化队列 InitQueue(&Q) 将队列Q设置成一个空队列。

2.入队列 EnQueue(&Q,X) 将元素X插入到队尾中,也称“进队” ,“插入”。

3.出队列 OutQueue(&Q,&e) 将队列Q的队头元素删除,并用e返回其值,也称“退队”、“删除”。

4.取队头元素 GetHead(Q,&e) 得到队列Q的队头元素之值,并用e返回其值。 5.判队空 QueueEmpty(Q) 判断队列Q是否为空,若为空返回1,否则返回0。

队列的顺序实现

在非空队列里,头指针始终指向队头元素,而尾指针始终指向队尾元素的下一位置。

#define MaxSize  100
typedef int DataType;
typedef struct{
   DataType data[MaxSize];
   int front,rear;
 }Queue;

顺序队列( MaxSize=4 )的几种状态:

(1)表示空队列, rear==front==0。 (4)A出队后,rear==front==3。再插入元素时,会出现假溢出的情况。

克服假溢出的方法:

(1)将队列中的所有元素均向最前端的位置移动;

(2)采用循环队列。

 循环队列

 循环队列的物理存储未发生任何改变,其只是充分利用数组空间,想象将数组的首尾连接起来,形成一个循环队列。

(a)表示空队列, rear==front==0。

(b)元素A入队后, rear==1, front==0。

(c)B,C依次入队后, rear==3, front==0。

(d)A,B,C出队后, front==3 ,rear==3。队列又为空

 所以,循环队列为空的判定条件为:front==rear;

基本实现

#include"stdio.h"
#include"stdlib.h"

#define Maxsize 100
typedef int DataType;

typedef struct {
    DataType data[Maxsize];
    int front,rear;
}Queue;

//初始化队列
void InitQueue(Queue *Q)
{
    Q->front=Q->rear=0;
}
//入队
int InQueue(Queue *Q,DataType x)
{
    if((Q->rear+1)%Maxsize==Q->front)
        return 0;
    Q->rear=(Q->rear+1)%Maxsize; //if (Q->rear+1)==Maxsize,Q->rear=0
    Q->data[Q->rear]=x;
    return 1;
}
//判断空队列
int EmptyQueue(Queue *Q)
{
    if(Q->rear==Q->front)
        return 1;
    else
        return 0;
}
//出队
int OutQueue(Queue *Q,DataType *x)
{
    if(EmptyQueue(Q))
        return 0;
    Q->front=(Q->front+1)%Maxsize;
    *x=Q->data[Q->front];
    return 1;
}
//取队头元素
int GetHead(Queue *pQ,DataType *px)
{ 
    if(EmptyQueue(pQ))
      {    printf("\n Queue is free");
            return 0;
      }
      *px=pQ->data[(pQ->front+1)%MaxSize];
          return 1;
}

循环队列中的常用判断语句

(1)队列判空条件:rear==front;

(2)队列判满条件:(rear+1)%MaxSize==front;

(3)入队操作:

    第①步,先判断队列是否已满;

    第②步,rear=(rear+1)%MaxSize;

    第③步:尾指针位置赋值相应元素;

(4)出队操作:

    第①步,先判断队列是否已空;

    第②步,front=(front+1)%MaxSize;

(5)计算循环队列中元素的个数: 分两种情况讨论,如图所示:

所以:(rear-front+MaxSize)%MaxSize。

队列的链式表示和实现

队列的链式存储结构简称为链队。它实际上是一个同时带有首指针和尾指针的单链表。头指针指向表头结点,而尾指针则指向队尾元素。

链队结构示意图:

 

链队的数据类型定义如下:

typedef int DataType;
typedef struct qnode{
    DataType data;
    struct qnode *next;
}Qtype;
typedef struct qptr{
    Qtype *front,*rear;
}LinkQueue;
LinkQueue LQ;

链队运算指针变化情况:

c语言实现:

#include"stdio.h"
#include"malloc.h"
typedef int DataType; //定义队列类型
//定义队结点
typedef struct node
{
    DataType data;
    struct node *next;
}qnode; //链队结点类型
 
typedef struct
{
    qnode *front; //定义qnode *类型的指针成员
    qnode *rear;
}LinkQueue;
 
//初始化队
int InitQueue(LinkQueue *Q)
{
    Q->front=Q->rear=(qnode *)malloc(sizeof(qnode)); //申请空间作头结点,头结点不存放数据
    if(!Q->front)  //if Q->front NULL
        return 0;
    Q->front->next=NULL; //使队头结点的指针域为NULL
    return 1;
}
//判断队空
int EmptyQueue(LinkQueue *Q)
{
    if(Q->front==Q->rear)
        return 1;
    else
        return 0;
}
//进队
void InQueue(LinkQueue *Q,DataType x)
{
    qnode *s;
    s=(qnode *)malloc(sizeof(qnode)); //申请一结点空间
    s->data=x;
    s->next=NULL; 
    Q->rear->next=s; //使s结点连上前一个结点
    Q->rear=s;  //尾指针指向结点,即最后一个结点
}
//出队
int OutQueue(LinkQueue *Q,DataType *e)
{
    qnode *q;
    if(EmptyQueue(Q))
        return 0;
    q=Q->front->next; //取头结点地址
    *e=q->data;  //返回头结点数据
    Q->front->next=q->next;  //头结点指针域存原第二结点地址
     if(Q->rear==q)  //if(Q->front->next==NULL) 若队列中只有1个元素,则出队后队列为空
         Q->rear=Q->front; 
     free(q); //释放q指向的结点,即队头结点 
    return 1;
}

队列的应用:

  • CPU资源的竞争问题。
  • 服务、排队问题。
  • 迷宫求解。

线性表、栈与队的异同点

相同点

逻辑结构相同,都是线性的;都可以用顺序存储或链表存储;栈和队列是两种特殊的线性表,即受限的线性表(只是对插入、删除运算加以限制)。

不同点

①运算规则不同,线性表为随机存取,而栈是只允许在一端进行插入和删除运算,因而是后进先出表LIFO;队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表FIFO。

②用途不同,线性表比较通用;堆栈用于函数调用、递归和简化设计等;队列用于离散事件模拟、多道作业处理和简化设计等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue前后端页面下载功能实现演示,Python+flask提供后台下载服务

Vue前后端页面下载功能实现效果图后台下载服务实现前台简单实现[ 文章推荐 ] Python 地图篇 - 使用 pyecharts 绘制世界地图、中国地图、省级地图、市级地图实例详解 效果图 首先看下演示效果。 点文档的话是 html 文档,跳转的预览,点下载的话是压缩包…

pycharm python 程序打包相关

前言 终于入门了python打包这个大话题,将目前学到的技能分享一下。 pycharm启动虚拟环境pipenv 缩小打包 和很多博客说的一样,打包那么大是因为打包了多余的库,因此想要缩小就需要一个干净的,没有多余的库的环境进行打包。也就是…

一文读懂内容生态驱动的“菌落式”增长

健康的内容生态对文娱行业极为重要。本文详细介绍了用内容生态建设驱动用户“菌落式”增长的路径。点击文末“阅读原文”立即观看完整直播回放,并下载演讲文档。内容生态与用户增长内容生态建设与用户增长互为因果。一方面,出圈的内容直接带来用户增长。…

《2022大数据产业年度创新服务企业》榜重磅发布丨金猿奖

‍年度金猿榜单/奖项本届“数据猿年度金猿策划活动——2021大数据产业创新服务企业榜单/奖项”由金猿&数据猿&上海大数据联盟共同推出。‍数据智能产业创新服务媒体——聚焦数智 改变商业2022年下半年度,由数据猿、金猿组委会共同推出的第五届 “年度金猿季…

通过usb利用adb实现android手机和pc机通信

1、 adb forward 原理概述 adb forward 的功能是建立一个转发 如:adb forward tcp:8000 tcp:9000 的意思是,将PC端的 8000 端口收到的数据,转发给手机中的 9000 端口。 但是光执行这个命令还不能转发数据,还需要完成下面两个步骤才…

【主色提取】HSV 颜色空间与 RGB 颜色空间互相转化的公式和代码

系列文章目录 第二章 主色提取之颜色空间转化 目录 系列文章目录 文章目录 前言 一、HSV 和 RGB 颜色空间 二、颜色转化 1. RGB to HSV 2. HSV to RGB 三、 完整代码 前言 HSV 颜色空间和 RGB 颜色空间的转化。 一、HSV 和 RGB 颜色空间 RGB颜色使用的最多&#xff0…

C语言详解【通讯录的实现】

前言: 在之前的学习中我们已经了解了结构体的一些知识,有了之前的知识的储备,在这里我们就可以尝试通讯录的实现。 目录问题描述基本流程前期的准备工作实现过程第一阶段第二阶段第三阶段1.增加联系人2.删除联系人3.打印通讯录4.查找指定联系…

高等数学(第七版)同济大学 习题11-7 个人解答

高等数学(第七版)同济大学 习题11-7 函数作图软件:Mathematica 1.试对曲面Σ:zx2y2,x2y2≤1,Py2,Qx,Rz2验证斯托克斯公式.\begin{aligned}&1. \ 试对曲面\Sigma:zx^…

yolov5+车道线检测

目标检测与车道线检测在自动驾驶以及车辆定位中起着重要的辅助作用,是环境感知中不可缺少的一个部分。基于深度学习的车道线检测方法近年来也在不断的提升,比如论文:Ultra Fast Deep Lane Detection with HybridAnchor Driven Ordinal Classi…

Allegro如何Wavie DRC操作指导

Allegro如何Wavie DRC操作指导 在做PCB设计的时候,会因为规则设置的原因,导致出现很多DRC,不方便检查,Allegro支持直接Waive掉正常DRC,方便检查,如下图 芯片中心需要打过孔方便散热,但是这些过孔的DRC是不需要显示的 具体操作如下 选择Display选择 Waive DRCs

数据结构与算法3—栈

1. 栈的定义 栈,也叫堆栈,是最常用也是最重要的数据结构之一。栈(Stack)是限定仅在表的一端进行插入或删除操作的线性表,通常称插入、删除的这一端为栈顶(Top),另一端为栈底(Bottom)。当表中没有元素时称为空栈。栈操作的特点&am…

【服务器数据恢复】StorNext文件系统数据恢复案例

服务器数据恢复环境: 昆腾系列存储,9个磁盘柜,每个磁盘柜配置24块硬盘。其中8个磁盘柜用于存储数据,1个磁盘柜用于存储元数据。上层使用的是StorNext文件系统。 存储元数据的磁盘柜中24块磁盘的分配情况:8组RAID1阵列1…

1361. 验证二叉树

目录题目思路代码题目 二叉树上有 n 个节点,按从 0 到 n - 1 编号,其中节点 i 的两个子节点分别是 leftChild[i] 和 rightChild[i]。 只有 所有 节点能够形成且 只 形成 一颗 有效的二叉树时,返回 true;否则返回 false。 如果节点…

开发小程序遇到的问题

1、小程序授权定位时报错 原因: 需要授权 scope.userLocation、scope.userLocationBackground 时必须配置地理位置用途说明。 解决: 在app.json中,根据开发文档的提示,将下面的代码添加在与pages同级下 "permission": {…

16年经验的通信行业测试人,后悔入错行了吗?

屏幕前的读者对于一个行业的兴衰有什么看法呢?非常很现实的说,我们所处的行业直接关系着每个人的收入,处于行业的不同生命周期内,我们拿到的钱也会不一样。下面用本人所处的行业举个例子。工作经历初入通信行业从我进入通信行业的…

什么是SPI?SPI的优点有哪些?

1、什么是SPI? SPI是串行外设接口(Serial Peripheral Interface)的缩写,是Motorola公司推出的一种同步串行接口技术,是一种高速、全双工、同步的通信总线。 2、SPI优点 支持全双工通信通信简单数据传输速率块 3、缺…

案例分析中可能的考点1:招投标程序

招投标程序: (1)投标方不满足资质要求; (2)投标过程不满足时间要求; (3)招标公告内容或过程不满足要求; (4)评标人员不满足组成要求&a…

【数据结构与算法】二叉树的非递归前中后序遍历

🌠作者:阿亮joy. 🎆专栏:《数据结构与算法要啸着学》 🎇座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉…

WebSphere8 批量安装和制作介质服务器

WAS 8.5 介质准备 1、安装install manager 2、安装IBM Packaging Utility unzip pu.offering.disk.linux_1.5.3000.20120531_2025.zip cd disk_linux/InstallerImage_linux ./consoleinst.sh 跟着向导安装。 3、安装PU mkdir pu cd pu unzip ../pu_1.5.3.zip ./imcl i…

如何使用集成在 SharePoint 中的开源 ONLYOFFICE 文档替代微软 Office

ONLYOFFICE 文档是一款开源的办公套件,在 GNU AGPL v3.0 下分发。它包括基于网络的查看器和协作编辑器,可用于处理文本文档、电子表格和演示文稿,与 OOXML 格式高度兼容。 ONLYOFFICE 文档可以与多种云服务集成,如 Nextcloud、ow…