算法小知识-----8.02-----设计循环队列

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

所谓题目越复杂,题型就越简单,恒古至今不变的定律

设计循环队列

该题出自力扣的622题 —— 设计循环队列【中等题】,有意思又简单的题目

审题

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。


循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

image.png

  • 题意相对简单,虽然很大一串描述,就是自己实现一个循环队列
    • 首先需要满足先进先出,也就是弹出头结点,新增尾节点
    • 其次因为是循环队列,与顺序队列不一样的是,尾节点会不断后移,严格意义在头结点的后面,也在前面
  • 按照题意的意思,不能使用内置库,那我们就尽量不使用LinkedList等链表
  • 定义一个数组,充当存储容器;四个变量:头结点下标、尾节点下标、可用长度K,以及已存节点数num
  • 因为是尾节点有可能在前面,所以需要使用(tail - 1) % k 计算出尾节点应该存储的位置
  • 先进先出的含义,所以头结点弹出只需要头结点下标后移即可,尾节点会自行覆盖

编码

    public MyCircularQueue(int k) {
        a = new int[k];
        head = tail = count = 0;
        this.k = k;
    }

    int[] a;
    int head,tail,count,k;
    public boolean enQueue(int value) {
        if (count == k){
            return false;
        }else {
            count++;
            a[tail % k] = value;
            return ++tail >= 0;
        }
    }

    public boolean deQueue() {
        if (count == 0){
            return false;
        }else {
        head++;
        count--;
        return true;
        }
    }

    public int Front() {
        if (count == 0){
            return -1;
        }
        return a[head % k];
    }

    public int Rear() {
        if (count == 0){
            return -1;
        }
        return a[(tail - 1) % k];
    }

    public boolean isEmpty() {
        if (count == 0) {
            return true;
        }
        return false;
    }

    public boolean isFull() {
        if (count == k) {
            return true;
        }
        return false;
    }

image.png

猜你喜欢

转载自juejin.im/post/7127109758766546951