算法小知识-----8.15-----设计循环双端队列

60 阅读2分钟

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

痛苦周一,领导出差,因为断电导致服务器宕机,修了一上午没解决,网络问题

设计循环双端队列

该题出自力扣的641题 —— 设计循环双端队列【中等题】,这道题和之前有一道题比较相似,但是加了相关的条件

审题

image.png

  • 该题并不困难,因为之前也做过类似的,不过当时并不要求是双端队列
  • 虽然可以用现成的数据结构,linkedList或者Dueue也可以,但是毕竟是考验数据结构的题目
  • 定义一个数组,充当队列的底层架构
    • 定义三个变量,头指针,尾指针,已存放长度
  • 这次不使用取余的方式去计算位置,虽然取余会更加优雅,但是对于可读性来说就有点困难(当然也是因为本身菜)
  • 判断头尾指针的边界
    • 头指针判断是否处于首位,也就是0,如果是则跨边界去长度 - 1的下标,因为是循环队列
    • 尾指针判断是否处于末位,也就是长度 -1,如果是则跨边界去0

编码

class MyCircularDeque {
    public MyCircularDeque(int k) {
        queue = new int[k];
        tail = k -1;
    }
    int[] queue;
    int size = 0,head =0,tail = 0;

    /**
     * boolean insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true ,否则返回 false 。
     * @param value
     * @return
     */
    public boolean insertFront(int value) {
        if (isFull()){
            return false;
        }
        queue[head = head == 0?queue.length - 1 : head - 1] = value;
        size++;
        return true;
    }

    /**
     * boolean insertLast() :将一个元素添加到双端队列尾部。如果操作成功返回 true ,否则返回 false 。
     * @param value
     * @return
     */
    public boolean insertLast(int value) {
        if (isFull()){
            return false;
        }
        queue[tail = tail == queue.length - 1?0 : tail + 1] = value;
        size++;
        return true;
    }

    /**
     * boolean deleteFront() :从双端队列头部删除一个元素。 如果操作成功返回 true ,否则返回 false
     * @return
     */
    public boolean deleteFront() {
        if (isEmpty()){
            return false;
        }
        head = head == queue.length - 1?0:head + 1;
        size--;
        return true;
    }

    public boolean deleteLast() {
        if (isEmpty()){
            return false;
        }
        tail = tail == 0?queue.length - 1:tail - 1;
        size--;
        return true;
    }

    /**
     * int getFront() ):从双端队列头部获得一个元素。如果双端队列为空,返回 -1 
     * @return
     */
    public int getFront() {
        return isEmpty()?-1:queue[head];
    }

    /**
     * int getRear() :获得双端队列的最后一个元素。 如果双端队列为空,返回 -1 。
     * @return
     */
    public int getRear() {
        return isEmpty()?-1:queue[tail];
    }

    /**
     * boolean isEmpty() :若双端队列为空,则返回 true ,否则返回 false  。
     * @return
     */
    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * boolean isFull() :若双端队列满了,则返回 true ,否则返回 false 。
     * @return
     */
    public boolean isFull() {
        return size == queue.length;
    }
}

image.png