每日一题(设计循环队列)

2023-11-10

每日一题(设计循环队列)

622. 设计循环队列 - 力扣(LeetCode)

在这里插入图片描述

1.题意解读

本题只能为队列开辟k个单位空间,并且只能利用这几个空间进行数据的存储。

思路:本题使用数组来实现队列是比较方便的,首先定义两个变量:front和rear变量。分别用于记录队头和队尾。一开始初始化时让front和rear都指向数组的第一个位置,存储数据时,按着下图的方式,向rear下标处存储数据,存储成功之后rear自加1,也就是意味着rear始终指向的当前队尾元素的下一个位置。

分析假设k的值是5,那么本来应该就是开辟5个空间。但是我用的这种方法需要多开辟一个单位的空间。为什么呢?假若我们开辟的是5的单位的空间,那么当存满了k个数据之后,此时的rear和front就都指向了数组中的第一个元素。那么请仔细想想,在初始化的时候我们也将rear和front也初始化为了0,也指向了数组中的第一个元素。那么在这两种情况下,front和rear都指向了数组的第一个元素,但是队列中的元素个数却是大不相同,无法将队列为满和队列为空进行分开。为了避免这种问题的发生,这里多开辟一个空间,当rear下标的下一个位置是front时,此时队列中存储了k个元素,也就说明了队列已满,那么同时判断队列为空就很方便了。只要rear与front相等时,队列就为空。

删除队头元素:删除队头的元素就只需要将front++即可。

在这里插入图片描述

注意:

  • 当遇到了非常规情况时:rear到了队尾需要循环到队头时则只需要执行语句 rear++;rear %= k+1;这两条语句即可。针对front到达队尾需要到达队头的情况也同样适用的。
  • 当需要获取队尾的元素时,实际上获取的是rear的前一个下标处的值,需要访问rear-1下标处的值,但是假若此时的rear的值是0,那么此时需要特判以下,假如rear的值是0时,直接访问k下标处的值即可。rear的值不为0时,只需要正常访问rear-1下标处的元素即可。

在这里插入图片描述

代码实现:

typedef struct {
    int* a;
    int front;
    int rear;
    int k;
} MyCircularQueue;

MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue*  obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    obj->a = (int*)malloc(sizeof(int)*(k+1));
    obj->front = 0;
    obj->rear = 0;
    obj->k = k;
    return obj;
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    assert(obj);
    return ((obj->rear)==(obj->front));
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
        assert(obj);
    return (((obj->rear+1)%(obj->k+1))==(obj->front));
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    assert(obj);
    if(!myCircularQueueIsFull(obj))//未满
    {
        obj->a[obj->rear] = value;
        obj->rear++;
        obj->rear %= (obj->k+1);
        return true;
    }
    return false;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    assert(obj);
    if(!myCircularQueueIsEmpty(obj))//非空
    {
        obj->front++;
        obj->front %=obj->k+1;
        return true;
    }
    return false;
}

int myCircularQueueFront(MyCircularQueue* obj) {
    assert(obj);
    if(myCircularQueueIsEmpty(obj))
    {
        return -1;
    }
    return obj->a[obj->front];
}

int myCircularQueueRear(MyCircularQueue* obj) {
        assert(obj);
    if(myCircularQueueIsEmpty(obj))
    {
        return -1;
    }
    if(obj->rear == 0)
        return obj->a[obj->k];
    else
    {
         return obj->a[obj->rear-1];
    }
}

void myCircularQueueFree(MyCircularQueue* obj) {
    assert(obj);
    free(obj->a);
    free(obj);
    obj=NULL;
}

完结

设计循环队列的分析就到这里啦,若有不足,欢迎评论区指正,下期见!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每日一题(设计循环队列) 的相关文章

  • 展开字符串中的环境变量

    是否有一些 java 实用程序 可以扩展 和 env 字符串中的变量 就像 bin MY PATH gt home john bin dev null 谢谢 基本上 您想要使用环境变量进行字符串插值并扩展主目录 我不知道执行后者的简单方法
  • 模拟匿名函数

    我正在编写 jUnits 但被 Lambda 表达式困住了 有没有办法模拟匿名函数 return retryTemplate execute retryContext gt return mockedResponse 在上面的代码中 我试图
  • CompletableFuture:几个任务

    如何使用 5 个 CompletableFutures 异步执行 20 个 Runnable 任务 或 1 个任务 20 次 这就是我所拥有的 Runnable task gt long startTime System currentTi
  • 如何在servlet 3.0的web.xml-less中定义

    我有现有的 web 应用程序 我想将其转换为 servlet 3 0 的 web xml less 我已经设法让它工作 但是 web xml 中有 2 个标签 我仍然不知道无 web xml 环境中的等效代码
  • 测试前设置TestNG的输出目录

    我正在使用 Eclipse 运行一些 TestNG 测试 使用 XML 文件 右键单击 作为 TestNG 套件运行 我仅将 Maven 用于依赖项 而不用于运行测试 有没有办法在代码中设置输出目录 例如 System out printl
  • onchange 使用 radioChoice 获取当前值

    我尝试使用 radioChoice onChange 从无线电表单中获取选定的值 但似乎无法真正找到解决方案 onEvent 函数被调用 但从这里我不太确定如何获取该值 Code RadioChoice
  • 是否有用于运行测试组的 JUnit TestRunner?

    我目前正在使用 JUnit 4 并且需要将我的测试分为可以以任意组合有选择地运行的组 我知道 TestNG 具有注释测试以将它们分配到组的功能 但我现在无法迁移到 TestNG 看来这可以通过一些自定义注释和自定义 JUnit TestRu
  • Java中如何保存DOM文档?

    我在用DOM解析器和XPATH解析我的XML文件 我改变了一个节点的值Document Object 然而当我打开我的XML文件 它没有向我显示任何反射 我的DOM解析器代码如下 private void setPortNumber int
  • IBM Websphere JPA 配置 - 如何更新 persistence.xml

    我是 EJB 3 和 JPA 的新手 我在应用程序服务器中创建了一个数据源 它是jdbc AppDataSource 默认持久性提供程序保留为com ibm websphere persistence PersistenceProvider
  • Java字符串模式识别

    我有一个大约一千个字符长的字符串 由 L T 和 A 组成 我很确定其中有一个简单的模式 我想知道是否有任何快速简便的方法可以找到它 该字符串会发生变化 因此这不仅仅是一次性的 我正在寻找的模式例如如果字符串是 LLLLLLLLAATAAL
  • 以编程方式获取 Android 设备的所有 RAM 内存,而不仅仅是分配给用户进程的内存

    我有一台设备 我确信它的 RAM 内存为 512 MB 希望能够以编程方式检索该值 512 MB 到目前为止 我在互联网上遇到的主要是这两种方式 https stackoverflow com a 16143065 1521264 http
  • 在Java中执行.lnk文件

    我需要在java中执行 lnk文件 指向exe文件的lnk文件 我能怎么做 在 VB net 中我做 Process Start path 它有效 谢谢你的帮助 Use a 流程构建器 http download oracle com ja
  • 如何在java中模拟SHIFT+鼠标按键

    我想将鼠标指针移动到特定位置并执行 SHIFT 鼠标右键单击 我可以将鼠标移动到某个位置 但无法模拟鼠标单击 Robot r new Robot r mouseMove x1 y1 我应该做什么来模拟预期的鼠标点击 我认为您只需要一点额外的
  • 我怎样才能设置在中间呢?

    我尝试用Java画一个矩形 我设置了框架大小 800 400 和可调整大小 假 矩形的x 50 y 50宽度 700高度 300 为什么它不在中间 谢谢 如果没有任何其他证据 我会guess你已经覆盖了paint类似的方法JFrame并直接
  • 使用Java在数组中查找子字符串索引

    我想使用 Java 从字符数组中返回用户输入子字符串的索引 该数组被初始化 打乱 然后进行搜索 我对此很陌生 尝试了两种不同的方法但没有成功 我在忽略什么 提前致谢 方法一 import java lang Math import java
  • Java 中的 C#“is”运算符替代方案 [重复]

    这个问题在这里已经有答案了 在 C 中 当我想知道一个对象是否是特定类型的实例时 我可以使用 is 运算符 String foo hi if foo is String 我怎样才能在java中做到这一点 我知道我可以使用 try 语句 还有
  • JPA:如何在不加载延迟加载集的情况下计算子记录数

    我正在编写一个 J2EE JPA Spring 3 应用程序 试图保持纯粹的 JPA 2 0 我想获得子对象的计数而不必加载它们 因为这显然是一个昂贵的操作 例如 这是一个简化的示例 Organisation OrgID OrgName E
  • 用于只读 DB 的 java ORM

    我了解 hibernate 但我想知道是否有一个更轻的 ORM 引擎只读数据库 我的意思是 我不需要一些事务查询或更新一些记录 另一方面 我需要处理一些大的记录列表 List
  • javax.persistence.Query.getResultList() 可以返回 null 吗?

    如果是的话 是在什么情况下 Javadoc 和 JPA 规范什么也没说 你是对的 JPA 规范对此只字未提 但Java Persistence with Hibernate 书籍 第二版 says 如果查询结果为空 则返回null 当您调用
  • 没有 WindowManager.LayoutParams.TYPE_PHONE 的粘性覆盖

    我所说的粘性是指一个不会通过调用启动器意图而关闭的窗口 intent addCategory Intent CATEGORY HOME 以前这是用完成的WindowManager LayoutParams TYPE PHONE 但此类型现已

随机推荐

  • tcp服务端通讯+按键发送协议

    import threading import socket import json import keyboard TCP服务器配置 HOST 0 0 0 0 PORT 8888 创建TCP服务端 server socket socket
  • kodi 下载插件失败/无法刮削

    kodi 下载插件失败 无法刮削 很有可能是被墙 或者DNS被污染 解决的方法很简单 修改host 并不是修改nas win kodi上的host 一个一个修改太麻烦了 而是在路由器上修改host 这样一来所有的设备都可以使用了 现在的路由
  • 【C++】STL初识

    目录 STL背景和定义 STL分类 STL三大分类 容器 算法 迭代器 STL六大组件 STL容器使用案例 创建容器 遍历容器 容器嵌套容器 STL背景和定义 STL是标准模板库 Standard Template Library STL
  • 基础算--简单枚举

    简单枚举 顾名思义 枚举便是依次列举出所有可能产生的结果 根据题中的条件对所得的结果进行逐一的判断 过滤掉那些不符合要求的 保留那些符合要求的 也可以称之为暴力算法 枚举结构 循环 判断语句 应用场合 在竞赛中 并不是所有问题都可以使用枚举
  • 【Vue3】SplitPane 可拖拽分隔面板组件

    1 效果图 2 组件完整代码
  • 算法笔记--最大连续1的个数Ⅲ

    leetcode题目链接 1004 最大连续1的个数 III 题目描述 给定一个二进制数组 nums 和一个整数 k 如果可以翻转最多 k 个 0 则返回 数组中连续 1 的最大个数 思路 这里可以转换思路 让题意更加明确 即 求一个最大连
  • 五十六.L1-017 到底有多二

    include
  • 【华为机试题】华为机试真题附解答(2020.9.16/c++)

    第一题题目描述 五键键盘只可以输入a ctrl c ctrl x ctrl v ctrl a 对应的功能为 a 输出到屏幕上a字母 ctrl c 复制选定内容到剪贴板 ctrl x 复制选定内容到剪贴板并且清空当前选定内容 ctrl v 将
  • Vue.js面试题整理

    一 什么是MVVM MVVM是Model View ViewModel的缩写 MVVM是一种设计思想 Model 层代表数据模型 也可以在Model中定义数据修改和操作的业务逻辑 View 代表UI 组件 它负责将数据模型转化成UI 展现出
  • 刷脸支付的产品也在慢慢的完善当中

    如今 春暖花开 万物复苏 在经历了疫情的严冬之后 相信 真正的春天即将来临 在这样的背景下 刷脸支付 这一被疫情耽误了的新的支付方式 或许将迎来一次全新的爆发 说 2019年被称为刷脸支付的元年 在很多人满怀期待刷脸支付或将在2020年进一
  • Java实现加密(一)AES加解密

    目录 1 背景知识 2 AES简介 3 AES的加密过程 AES处理单位 字节 4 Java实现 4 1 生成密钥和偏移量 4 2 AESUtil java 源码 4 3 执行结果 4 4 线上验证 1 背景知识 在密码学中 加密算法分为单
  • facebook 邀请好友

    话不多说 直接上代码了 邀请好友 public void sendFilteredChallenge final Vector
  • 多表连接查询详解

    1 1 多表连接查询的概念 由于数据库中很多数据被分散到多个数据库表中 在查询数据时就经常出现要查的数据来自多个表中 此时就必须采用多表连接查询 多表连接查询是数据库查询中常见的查询方式 多表连接查询分为内连接和外连接 1 2 内连接的概念
  • vpd安全策略的使用

    1 首先我们创建用户vpd 并给与一定的权限 create user vpd identified by 123456 grant resource connect to vpd grant execute on dbms rls to v
  • 电脑无法登录microsoft账号怎么办?

    电脑登录Microsoft账号的方法 请按以下步骤进行 打开控制面板 右键点击左下角的Windows徽标就可以看见弹出菜单有这个选项 win10系统则可以通过搜索功能直接查到控制面板 进入控制面板后把查看方式改为大图标 然后选择网络和共享中
  • 硬核!八张图搞懂 Flink 端到端精准一次处理语义 Exactly-once(深入原理,建议收藏)

    Flink 在 Flink 中需要端到端精准一次处理的位置有三个 Source 端 数据从上一阶段进入到 Flink 时 需要保证消息精准一次消费 Flink 内部端 这个我们已经了解 利用 Checkpoint 机制 把状态存盘 发生故障
  • PAT-哈夫曼树(list、collection)

    Huffuman树 qdulq 40 分 Huffman树在编码中有着广泛的应用 在这里 我们只关心Huffman树的构造过程 给出一列数 pi p0 p1 pn 1 用这列数构造Huffman树的过程如下 1 找到 pi 中最小的两个数
  • 加密套件ECDHE_SM2_WITH_SM4_SM3及握手分析

    应证监局要求 国内金融产品程序化交易软件应采用国密算法实现SSL TLS通讯 我司采用开源项目GmSSL2 0实现 加密套件选用ECDHE SM2 WITH SM4 SM3 其中协议版本为TLS1 2 密钥交换 Key Exchange 算
  • Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案

    http blog csdn net boonya article details 70157820 Mybatis与JDBC批量插入MySQL数据库性能测试 Author boonya Date 2017 04 13 1 背景 系统中需要
  • 每日一题(设计循环队列)

    每日一题 设计循环队列 622 设计循环队列 力扣 LeetCode 1 题意解读 本题只能为队列开辟k个单位空间 并且只能利用这几个空间进行数据的存储 思路 本题使用数组来实现队列是比较方便的 首先定义两个变量 front和rear变量