【刷题日记】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

好了,本次就到这里

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

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

相关文章
|
6月前
|
存储
实现单链表的基本操作(力扣、牛客刷题的基础&笔试题常客)
实现单链表的基本操作(力扣、牛客刷题的基础&笔试题常客)
190 38
|
5月前
|
算法
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
|
6月前
|
C语言
猿创征文|栈和队列OJ刷题
猿创征文|栈和队列OJ刷题
|
Cloud Native
【刷题日记】641. 设计循环双端队列
【刷题日记】641. 设计循环双端队列
|
存储 算法 Java
面试题精选:循环队列
近期在面试找工作的小伙伴们很多啊,我周围就有好几个认识的朋友在找工作,于是我突发奇想在CSDN开了一个面试题精选的专栏,主要会关注一些算法题、设计题,次要会补充一些java面试相关的题(比较本博主是java出身)。其实在此之前已经写过一些相关的文章了,已经整理到专栏里的,后续会持续更新,希望对大家有所帮助,有兴趣的旁友可以关注下。
57 1
|
11月前
|
存储 算法 索引
【LeetCode刷题日志】622.设计循环队列
【LeetCode刷题日志】622.设计循环队列
|
存储
每日一题(设计循环队列)
每日一题(设计循环队列)
|
算法 Cloud Native
【刷题日记】1161. 最大层内元素和
【刷题日记】1161. 最大层内元素和
|
Cloud Native
【刷题日记】剑指 Offer II 029. 排序的循环链表
本次刷题日记的第 69 篇,力扣题为:剑指 Offer II 029. 排序的循环链表,中等
|
存储 算法 C++
数据结构与算法之美 | 一文掌握队列Queue(真题讲解)
所谓的循环队列,可以把数组看出一个首尾相连的圆环,删除元素时将队首标志往后移动,添加元素时若数组尾部已经没有空间,则考虑数组头部的空间是否空闲,如果是,则在数组头部进行插入。
数据结构与算法之美 | 一文掌握队列Queue(真题讲解)