队列基础(循环队列)

1.队列的定义:

和栈相反,队列(queue)是一种先进先出(first in  first out,缩写为FIFO)的线性表.它只允许在表的一端进行插入,而在另一端删除元素.

在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front).

2.循环队列的设计图示:

3.循环队列的结构设计:

typedef  struct  SqQueue
{
    int *base;//指向动态内存;
    int front;//队头指针,队头元素的下标
    int rear;//队尾指针,当前可以插入数据的下标(队尾后一个元素的下标)
    //int queuesize;//队列的总容量,要做到自动扩容就必须增加这个成员;
}SqQueue,*PSqQueue;

4.循环队列的实现

//初始化
void  InitQueue(PSqQueue pq)
{
    assert(pq != NULL);
    if (pq == NULL)
        return;

    pq->base = (int*)malloc(sizeof(int) * SIZE);
    assert(pq->base != NULL);

    pq->front = 0;
    pq->rear = 0;
}

static  bool IsFull(PSqQueue pq)
{
    return  (pq->rear + 1) % SIZE == pq->front;
    //return pq->rear + 1 == pq->front;//error,需要处理成环形;
}

//往队列中入数据(入队操作)
bool  Push(PSqQueue pq, int val)
{
    assert(pq != NULL);
    if (pq == NULL)
        return false;

    if (IsFull(pq))//如果队满则入队失败
    {
        return false;
    }
    pq->base[pq->rear] = val;
    //pq->rear++;//error,必须要处理成环形;
    pq->rear = (pq->rear + 1) % SIZE;
    return true;
}
//获取队头元素的值,但是不删除
bool  GetTop(PSqQueue pq, int* rtval)
{
    assert(pq != NULL);
    if (pq == NULL)
        return false;

    if (IsEmpty(pq))
    {
        return false;
    }
    *rtval = pq->base[pq->front];
    return true;
}
//获取队头元素的值,但是删除
bool   Pop(PSqQueue pq, int* rtval)
{
    assert(pq != NULL);
    if (pq == NULL)
        return false;

    if (IsEmpty(pq))
    {
        return false;
    }
    *rtval = pq->base[pq->front];
    //pq->front++;//error
    pq->front = (pq->front + 1) % SIZE;
    
    return true;
}
//判空
bool IsEmpty(PSqQueue pq)
{
    assert(pq != NULL);
    if (pq == NULL)
        return false;

    return  pq->front == pq->rear;
}
//获取队列中有效元素的个数
//重点,考点:公式
int  GetLength(PSqQueue pq)
{
    assert(pq != NULL);
    if (pq == NULL)
        return -1;

    return (pq->rear - pq->front + SIZE) % SIZE;
}
//清空所有的数据
void Clear(PSqQueue pq)
{
    pq->front = 0;
    pq->rear = 0;
}
//销毁
void Destroy(PSqQueue pq)
{
    assert(pq != NULL);
    if (pq == NULL)
        return;
    free(pq->base);
    pq->base = NULL;
    pq->front = 0;
    pq->rear = 0;
}

5.循环队列的总结

1)队列:先进先出的一种线性结构,入队(插入)的一端称为队尾,出队(删除)的一端称为队头
2)队列的存储方式有两种,一种为顺序结构(顺序队列),两一种为链式结构(链式队列)

3)顺序队列一定会设计成环形队列,原因是线性队列的入队为O(1),出队为O(n),而环形队列的入队为O(1),出队为O(1)
4)浪费一个空间不使用,主要是为了区分队空和队满的情况:空是队头和队尾相同,满是rear(队尾指针)再往后走一步为front(队头指针) (浪费一个空间)

5)队满的处理方式:1.固定长度,队满则入队失败(处理简单,不实用),采用1,和书本一致.2,长度不固定,队满则自动扩容(实现稍微复杂)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

货代FOB条款卖方必备的知识:发货人都要承担哪些费用呢?

据统计,中国出口中以FOB成交的占到70%,但专家指出:FOB对出口商的风险更大,有可能造成货、款两空的结局。 目前我国出口合同以FOB价格条款成交的比例越来越大,而且收货人指定船公司的少,指定境外货代的多&am…

【强迫症患者必备】SpringBoot项目中Mybatis使用mybatis-redis开启三级缓存必须创建redis.properties优化方案

springboot项目中mybatis使用mybatis-redis开启三级缓存需要创建redis.properties优化方案 前言下载mybatis-redis源码分析RedisCache 代码RedisConfigurationBuilder的parseConfiguration方法 优化改造1.创建JedisConfig类2.复制RedisCache代码创建自定义的MyRedisCache3.指定…

WSL中安装的Pycharm如何在Windows的开始菜单中新建图标?或WSL中的Pycharm经常花屏

WSL中安装的Pycharm如何在Windows的开始菜单中新建图标?或WSL中的Pycharm经常花屏 ⚙️1.软件环境⚙️🔍2.问题描述🔍🐡3.解决方法🐡🤔4.结果预览🤔 ⚙️1.软件环境⚙️ Windows10 教育版64位 W…

智慧灯杆网关:引领城市智慧照明的未来

智慧灯杆网关,作为城市智慧照明系统的核心组件,正逐渐成为各大城市发展的关键所在。它的出现使得城市照明管理更加智能、高效,为未来城市的可持续发展奠定了坚实的基础。 智慧灯杆网关是一种集网络通信、数据处理、远程控制等功能于一体的设备…

南大通用 GBase 8s数据库级别权限

对于所有有权使用指定数据库的用户都必须赋予其数据库级别的用户权限。在GBase 8s 中,数据库级别的用户权限有三种,按权限从低到高排列依次为:CONNECT、RESOURCE、DBA。 1. CONNECT 这是级别最低的一种数据库级别用户权限。拥有该权限的用户…

基于SSM框架的餐馆点餐系统的设计

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

centos7内核升级(k8s基础篇)

1.查看系统内核版本信息 uname -r 2.升级内核 2.1更新yum源仓库 yum -y update更新完成后,启用 ELRepo 仓库并安装ELRepo仓库的yum源 ELRepo 仓库是基于社区的用于企业级 Linux 仓库,提供对 RedHat Enterprise (RHEL) 和 其他基于 RHEL的 Linux 发行…

2023-11-30 LeetCode每日一题(确定两个字符串是否接近)

2023-11-30每日一题 一、题目编号 1657. 确定两个字符串是否接近二、题目链接 点击跳转到题目位置 三、题目描述 如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 : 操作 1:交换任意两个 现有 字符。 例如&…

手持工业平板电脑数字化工厂建设不可缺失的智能终端

数字化生产管理是指利用信息技术手段对生产过程进行全面数字化、网络化、智能化管理的方法。通过采集、传输、存储、处理和分析生产过程中的各种数据,实现对生产过程的实时监控、调度和优化,以提高生产效率、降低成本、提升产品质量和灵活性,…

力扣202题 快乐数 双指针算法

快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&#…

低代码市场火爆:哪些产品的服务商模式更实用、更易用?

中国低代码/零代码市场参与者类型较多,除竞争关系外,不同类型供应商之间也可能基于特定原因而存在合作关系,企业客户也可能选择不同的供应商来满足不同开发类型、差异化业务场景功能的需求。 传统软件开发方式不仅周期长、成本高,…

06_MySQL数据库高可用解决方案(MHA)

各位道友好,鼠鼠我呀校招刚通过了移动的面试 ,但是安排的岗位是偏远县城里面的岗位,各位能给给建议吗?鼠鼠我啊真不想有时候变成销售员去卖产品!!! 任务背景 一、真实案例 公司现在需要做MySQ…