顺序队列的实现及其应用

一、概念

  • 队列是允许在两端(队头、队尾)进行插入和读出操作线性表

  • 默认情况下队尾插入,队头读出(这一点和排队很像),先进先出FIFO

  • 队中没有元素时称为空队

  • 当队列两端都允许插入、读出时,称为双端队列

 

 二、顺序队列的结构模型

typedef int data_t

#define N (128)	//队列容量
    
typedef struct{
    data_t data[N]; //数组作为队列的存储空间
    int front; //队头 指向队头元素
    int rear;  //队尾 指向队尾元素的下一个位置
}sequeue;

2.1队空

 刚创建的空队列就是如此,由此也可以得到空队的条件就是:front == rear

2.2入队

假设入队D1、D2、D3

这里入队的逻辑是,先入队元素,rear再移动(实际上也是rear++)

特殊情况是:入队的元素过多导致rear溢出,可以利用取余操作来避免这一风险

即:rear = (rear+1) % N

因此,这样一来也促成了“循环队列”

2.3出队

依次出队D1、D2

这里出队的逻辑是:先出队元素,front再移动

这里出队实际上也会遇到溢出情况,因为是循环队列,所以front的移动也对N取余即可

2.4满队

当队列再入队D7时,rear会移动到和front相同位置,但此刻是“满队”,会和“空队”冲突 

为了避免这个情况,D7不允许入队,解决办法是:入队时进行判断,如果rear+1等于front,那么不执行入队操作

三、顺序队列的实现

typedef int data_t;
#define N 128

typedef struct{
    data_t data[N]; //数组作为队列的存储空间
    int front; //队头 指向队头元素
    int rear;  //队尾 指向队尾元素的下一个位置
}sequeue;

sequeue *queue_create(void);            //创建队列
int enqueue(sequeue *q, data_t value);  //入队
data_t dequeue(sequeue *q);             //出队
int queue_is_empty(sequeue *q);         //判断队列是否为空
int queue_is_full(sequeue *q);          //判断队列是否已满
int queue_clear(sequeue *q);            //清空队列
sequeue *queue_free(sequeue *q);        //释放队列空间

3.1创建

sequeue *queue_create(void)
{
    sequeue *q;

    //申请空间
    q = (sequeue*)malloc(sizeof(sequeue));
    if(q == NULL)
    {
        printf("queue_create:malloc space failed!\n");
        return NULL;
    }
    //初始化
    memset(q->data,0,sizeof(q->data));
    q->front = 0;
    q->rear = 0;

    return q;
} 

3.2入队

int enqueue(sequeue *q, data_t value)
{
    //参数检查
    if(q == NULL)
    {
        printf("enqueue:queue passed is NULL!\n");
        return -1;
    }
    //判断队列是否已满
     if( (( q->rear + 1) % N) == q->front)
    {
        printf("enqueue:queue is full!\n");
        return -1;
    }
    //入队
    q->data[q->rear] = value;
    //队尾++ 对N取余保证不溢出
    q->rear = (q->rear + 1) % N;

    return 1;
}

3.3出队

data_t dequeue(sequeue *q) 
{
    data_t ret;//保存出队元素

    //参数检查
    if(q == NULL)
    {
        printf("dequeue:queue passed is NULL!\n");
        return -1;
    }

    //应由程序判断队列是否为空,这里就不判断了
    ret = q->data[q->front];
    //front移动
    q->front = (q->front + 1) % N;

    return ret;
}

3.4判断队列是否为空

int queue_is_empty(sequeue *q)   
{
    //参数检查
    if(q == NULL)
    {
        printf("queue_is_empty:queue passed is NULL!\n");
        return -1;
    }

    return (q->front==q->rear? 1 : 0);
}

3.5判断队列是否已满

int queue_is_full(sequeue *q)    
{
    //参数检查
    if(q == NULL)
    {
        printf("queue_is_full:queue passed is NULL!\n");
        return -1;
    }    

    //判断队列是否已满
    if( (( q->rear + 1) % N) == q->front)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

3.6清空队列

int queue_clear(sequeue *q)       
{
    //参数检查
    if(q == NULL)
    {
        printf("queue_clear:queue passed is NULL!\n");
        return -1;
    }

    q->front = 0;
    q->rear = 0;

    return 1;
}

3.7释放队列空间

sequeue *queue_free(sequeue *q)    
{
    //参数检查
    if(q == NULL)
    {
        printf("queue_free:queue passed is NULL!\n");
        return NULL;
    }

    free(q);
    q = NULL;

    return NULL;//传回主程序,避免野指针
}

四、应用

#include <stdio.h>
#include "sequeue.h"

int main(void)
{
        sequeue *q;

        q = queue_create();
        if(q == NULL)
        {
                printf("queue_create:create failed!\n");
                return -1;
        }

        enqueue(q,10);
        enqueue(q,20);
        enqueue(q,30);
        enqueue(q,40);
        enqueue(q,50);
        enqueue(q,60);

        while(!queue_is_empty(q))
        {
                printf("dequeue:%d\n",dequeue(q));
        }

        q = queue_free(q);

        return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web安全深度剖析

1.Web安全简介 ​ 攻击者想要对计算机进行渗透&#xff0c;有一个条件是必须的&#xff0c;就是攻击者的计算机与服务器必须能够正常通信&#xff0c;服务器与客户端进行通信依靠的就是端口。 ​ 如今的web应该称之为web应用程序&#xff0c;功能强大&#xff0c;离不开四个要…

C# 探险之旅:第九节 - 循环(for):无限循环的魔法轮盘!

嘿&#xff0c;勇敢的探险家们&#xff0c;欢迎回到C#的神秘世界&#xff01;在这一节里&#xff0c;我们将踏上一场关于循环的奇妙冒险&#xff0c;特别是那个能带我们无限次探险的“for循环”&#xff01;准备好了吗&#xff1f;让我们一起揭开for循环的神秘面纱&#xff0c;…

解决Logitech G hub 无法进入一直转圈的方案(2024.12)

如果你不是最新版本无法加载尝试以下方案&#xff1a;删除AppData 文件夹下的logihub文件夹 具体路径&#xff1a;用户名根据实际你的请情况修改 C:\Users\Administrator\AppData\Local 如果你有通过lua编译脚本&#xff0c;记得备份&#xff01;&#xff01; ↓如果你是最新…

如何使用 Docker Compose 创建 LAMP 环境 ?

现如今&#xff0c;通过 Docker 容器化部署环境已经逐渐成为主流&#xff0c;特别是在部署像 LAMP (Linux、Apache、MySQL、PHP) 这样的复杂环境时。本教程旨在带您完成使用 Docker-Compose 建立 LAMP 环境的整个过程&#xff0c;同时还包括定制 PHP 环境的步骤&#xff0c;安装…

12.1【JAVA EXP4】next项目

next项目构建问题 详解一下这个页面 什么是Node选项&#xff1f; Node选项是指在运行Node.js应用程序时可以传递给Node.js进程的一系列命令行参数。这些选项可以让开发者控制Node.js的行为&#xff0c;例如设置内存限制、启用或禁用某些功能、指定调试端口等 --inspect 和 --i…

PyTorch3D 可视化

PyTorch3D是非常好用的3D工具库。但是PyTorch3D对于可用于debug&#xff08;例如调整cameras参数&#xff09;的可视化工具并没有进行系统的介绍。这篇文章主要是想介绍我觉得非常使用的PyTorch3D可视化工具。 1. 新建一个Mesh 从hugging face上下载一个glb文件&#xff0c;例…

内网穿透讲解

什么是内网穿透 内网穿透是一种网络技术&#xff0c;它允许外网或者其他局域网的用户来访问这个局域网的服务器资源&#xff0c;让资源的利用率更高&#xff0c;更加灵活&#xff0c;但是也要确保网络安全。 工作原理 如果你在公司&#xff0c;但是你需要使用到你家里的那台电…

Python中PyTorch详解

文章目录 Python中PyTorch详解一、引言二、PyTorch核心概念1、张量&#xff08;Tensor&#xff09;1.1、创建张量1.2、张量操作 2、自动求导&#xff08;Autograd&#xff09;2.1、自动求导示例 三、构建神经网络1、使用nn模块2、优化器&#xff08;Optimizer&#xff09; 四、…

Linux之网络配置

一、检查虚拟机和本机通不通 测试虚拟机和本机是否通不通 winR&#xff0c;运行本机cmd&#xff0c;输入ipconfig&#xff0c;拿到本机ip地址 在虚拟机上ping一下这个地址(ctrlshitv)可以把复制的文本粘贴进虚拟机。 可以看到&#xff0c;不通&#xff0c;解决方法在最后&am…

细说Flash存储芯片W25Q128FW和W25Q16BV

目录 一、Flash存储芯片W25Q128FW 1、W25Q128硬件接口和连接 2、存储空间划分 3、数据读写的原则 4、操作指令 &#xff08;1&#xff09;“写使能”指令 &#xff08;2&#xff09;“读数据”指令 &#xff08;3&#xff09;“写数据”指令 5、状态寄存器SR1 二、Fl…

33.攻防世界upload1

进入场景 看看让上传什么类型的文件 传个木马 把txt后缀改为png 在bp里把png改为php 上传成功 用蚁剑连接 在里面找flag 得到

鸿蒙元服务上架

鸿蒙元服务上架 一、将代码打包成 .app 文件1. 基本需求2. 生成密钥和证书请求文件3. 申请发布证书4. 申请发布Profile5. 配置签名信息6. 更新公钥指纹7. 打包项目成 .app 文件 二、发布元服务1. 进入应用信息页面2. 上传软件包3. 配置隐私协议4. 配置版本信息5. 提交审核&…

ansible自动化运维(二)playbook模式详解

相关文章ansible自动化运维&#xff08;一&#xff09;简介及清单,模块-CSDN博客ansible自动化运维&#xff08;三&#xff09;jinja2模板&&roles角色管理-CSDN博客ansible自动化运维&#xff08;四&#xff09;运维实战-CSDN博客 一.Ansible中的playbook模式 Playbo…

图像分割数据集海洋水体船只分割数据集labelme格式6123张3类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;6123 标注数量(json文件个数)&#xff1a;6123 标注类别数&#xff1a;3 标注类别名称:["water","sea_obstacle",&…

python爬虫知识

文章目录 安装requests安装BeautifulSoup4text函数 数据存储Excel操作操作Excel依赖安装 CSV文件操作 安装requests pip install requests安装BeautifulSoup4 pip install BeautifulSoup4示例&#xff1a; res requests.get(url,headersheaders)if res.status_code 200:bs…

Comparator.comparing 排序注意

1. 对数字型字符串排序 List<String> values new ArrayList<>();values.add("10");values.add("6");values.add("20");values.add("30");values.add("50");//方法1 &#xff08;正确的排序方法&#xff09;//倒…

Go有限状态机实现和实战

Go有限状态机实现和实战 有限状态机 什么是状态机 有限状态机&#xff08;Finite State Machine, FSM&#xff09;是一种用于建模系统行为的计算模型&#xff0c;它包含有限数量的状态&#xff0c;并通过事件或条件实现状态之间的转换。FSM的状态数量是有限的&#xff0c;因此称…

Linux shell的七大功能 --- history

1.直接输入“history” 这个命令可以显示出曾经使用过的命令&#xff08;最近时间的500条&#xff09; history 2.“history”命令也可以搭配其他命令一起使用。 例&#xff1a;history | grep "vim"&#xff0c;找出所有包含“vim”的记录&#xff1b; 也可以搭配…

精品基于Python实现的微信小程序校园导航系统-微信小程序

[含文档PPT源码等] [包运行成功永久免费答疑辅导] 《django微信小程序校园导航系统》该项目采用技术Python的django框架、mysql数据库 &#xff0c;项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、核心代码介绍视频等 软件开发环境及开发工具&#xf…

Ubuntu18安装后基本配置操作

1. 关掉自动更新 不关掉自动更新&#xff0c;会将你的ubuntu系统更新到更高版本&#xff0c;一些配置就不能用了&#xff0c;所以要关掉自动更新。在“软件和更新”中将“自动检查更新”设置为从不。 2. ubuntu换国内源 参考链接换源 按照这个换源这个换源好使 &#xff0c;…