【刷题日记】622. 设计循环队列

简介: 【刷题日记】622. 设计循环队列

一、题目描述:

今天来做一个循环队列设计相关的题,可不仅仅是刷一个算法题哦,这设计到基本简单的设计

image.png

二、这道题考察了什么思想?你的思路是什么?

本题是考查咱们的简单设计能力,对于循环队列的简单设计,先保证功能,再考虑优化和优雅,好程序都是迭代出来

题目要求我们自己实现一个队列,需要有如下功能点:

  • MyCircularQueue(k): 构造器,设置队列长度为 k 。
  • Front: 从队首获取元素。如果队列为空,返回 -1 。
  • Rear: 获取队尾元素。如果队列为空,返回 -1 。
  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
  • isEmpty(): 检查循环队列是否为空。
  • isFull(): 检查循环队列是否已满。

分析

根据题目的要求,我们要先明确队列的特性,队列是先入先出的 FIFO,那么循环队列是什么呢,就是首尾连接成环,简单来说就是队尾的下一个是队头

对于一个循环队列,我们至少需要哪些元素呢?

  • 基本的数据节点对象,队列对象
  • 队列的最大容量和队列的当前已有数据量
  • 队列的头 和 队列的尾

设计一个基本的循环队列,能够满足上述条件,就可以完成本题的基本设计了,我们可以这样来设定标准:

  • 对于构造器

MyCircularQueue(k),实际上就是咱们就是初始化一个队列的对象,初始化整个队列的容量

  • Front: 从队首获取元素

即我们读取对头的数据即可,如果队列为空,则直接返回 -1 即可

  • Rear: 获取队尾元素

同理,咱们直接读取队列尾巴的元素即可,若队尾尾空,则返回 -1

  • enQueue(value)

元素入队,这里我们就要考虑三种情况

image.png

  • 当队列里面是空的时候入队

直接将数据做成节点,让队列的 head 和 tail 都指向这个节点即可,并且把队列的 size +1

  • 队列里面已经有元素的时候入队

若队列未满,则正常将数据做成节点,让尾指针指向最新的节点即可,并且把队列的 size +1

  • 以及队列里面已经满了的情况入队

若校验到队列已满,则禁止入队,返回 false

  • deQueue()

出队,刚才有说到,队列是 FIFO 的,上述入队是从尾巴加入,那么出队就是从头出去,咱们需要考虑 2 种情况

image.png

  • 队列为空的情况

这个时候无数据出队,则返回 false

  • 队列不为空

则正常从取出当前 head 的值,并将 head 的指针向下移动一个,此时的 size -1

  • 那么判断队列为空,则直接判断队列的 size 是否为 0 即可
  • 判断队列是否为满,同理,直接判断当前的 size 是否等于 队列的容量 cap 即可

那么实际上编码就是将上述逻辑进行一个翻译就可以了,另外,此处如果是要访问 tail 的下一个指针,其实我们是知道就是要访问 head 的,因此此处没有显示的将 tail 指针指向 head

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

编码如下:

type MyCircularQueue struct {
    head, tail     *ListNode
    cap, size int
}
func Constructor(n int) MyCircularQueue {
    return MyCircularQueue{cap: n}
}
func (q *MyCircularQueue) EnQueue(value int) bool {
    if q.IsFull() {
        return false
    }
    node := &ListNode{Val: value}
    if q.head == nil {
        q.head = node
        q.tail = node
    } else {
        q.tail.Next = node
        q.tail = node
    }
    q.size++
    return true
}
func (q *MyCircularQueue) DeQueue() bool {
    if q.IsEmpty() {
        return false
    }
    q.head = q.head.Next
    q.size--
    return true
}
func (q MyCircularQueue) Front() int {
    if q.IsEmpty() {
        return -1
    }
    return q.head.Val
}
func (q MyCircularQueue) Rear() int {
    if q.IsEmpty() {
        return -1
    }
    return q.tail.Val
}
func (q MyCircularQueue) IsEmpty() bool {
    return q.size == 0
}
func (q MyCircularQueue) IsFull() bool {
    return q.size == q.cap
}

四、总结:

image.png

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关文章
|
12月前
|
IDE Android开发 iOS开发
深入解析Android与iOS的系统架构及开发环境差异
本文旨在探讨Android和iOS两大主流移动操作系统在系统架构、开发环境和用户体验方面的显著差异。通过对比分析,我们将揭示这两种系统在设计理念、技术实现以及市场策略上的不同路径,帮助开发者更好地理解其特点,从而做出更合适的开发决策。
801 2
|
数据采集 大数据
大数据实战项目之电商数仓(二)
大数据实战项目之电商数仓(二)
305 0
|
JavaScript
Vue学习之--------Vue中自定义插件(2022/8/1)
这篇文章介绍了Vue中自定义插件的基本概念和实际应用,包括插件的定义、在`main.js`中使用`Vue.use()`引入插件,并通过代码实例展示了如何创建包含全局过滤器、指令和混入的插件,以及如何在Vue组件中使用这些自定义功能。同时,文章还解释了什么是mixin(混入)以及它的使用方式。
Vue学习之--------Vue中自定义插件(2022/8/1)
|
vr&ar C# 图形学
如何开发增强现实(AR)应用:技术指南与实践
【8月更文挑战第24天】开发增强现实应用是一个充满挑战和机遇的过程。通过选择合适的技术栈、遵循科学的开发步骤,并充分考虑用户体验、设备兼容性、内容与创意以及数据安全等因素,您可以成功打造一款高质量的AR应用。随着技术的不断进步和应用场景的不断拓展,AR应用的未来充满了无限可能。
|
存储 关系型数据库 MySQL
关系型数据库mysql文件系统兼容性
【6月更文挑战第14天】
277 3
|
安全 测试技术 数据库
华测检测软件登记测试
软件产品登记测试由检测机构根据委托方提供的材料,验证软件功能是否正常运行。自2000年起,测试报告可用于增值税退税、双软认证评估及高新企业认定等。测试涵盖应用、嵌入式、数据库及系统软件等,依据GB/T 25000.51-2016标准,确保软件质量并提升产品销售力及企业信任度。由具备CNAS及CMA资质的CTI华测检测提供专业服务,涵盖通用应用软件测评、APP安全检测及信息安全服务等多个方向。
|
前端开发 JavaScript 容器
响应式布局
响应式布局
|
Java jenkins 测试技术
GitHub排名第一《lntellij IDEA软件开发与应用实战手册》限时开源
IntelliJ IDEA简称IDEA,是Java语言的集成开发环境,在业界被公认为是最好的Java开发工具之一 讲解IntelliJ IDEA的诸多使用技巧,但事实上想要覆盖所有的操作要点是不可能的事情,因此笔者挑选了一些需要掌握及建议掌握的知识内容。
231 0
|
消息中间件 SQL Java
Spring-cloud-stream-binder-rocketmq入门与实践
本场景带您体验如何在 Spring 生态中优雅地使用 Apache RocketMQ,感受最受欢迎业务开发框架与最受欢迎消息平台结合的魅力。