← All problems

641. Design Circular Deque

MediumOpen on LeetCodeProblem statement

Problem Statement

641. Design Circular Deque

Medium


Design your implementation of the circular double-ended queue (deque).

Implement the MyCircularDeque class:

 

Example 1:

Input
["MyCircularDeque", "insertLast", "insertLast", "insertFront", "insertFront", "getRear", "isFull", "deleteLast", "insertFront", "getFront"]
[[3], [1], [2], [3], [4], [], [], [], [4], []]
Output
[null, true, true, true, false, 2, true, true, true, 4]

Explanation
MyCircularDeque myCircularDeque = new MyCircularDeque(3);
myCircularDeque.insertLast(1);  // return True
myCircularDeque.insertLast(2);  // return True
myCircularDeque.insertFront(3); // return True
myCircularDeque.insertFront(4); // return False, the queue is full.
myCircularDeque.getRear();      // return 2
myCircularDeque.isFull();       // return True
myCircularDeque.deleteLast();   // return True
myCircularDeque.insertFront(4); // return True
myCircularDeque.getFront();     // return 4

 

Constraints:

Java

Source file
class MyCircularDeque {

    int[] q;
    int size;
    int frontIdx;
    int lastIdx;

    public MyCircularDeque(int k) {
        size = k;
        frontIdx = 1;
        lastIdx = 0;
        q = new int[k];
        Arrays.fill(q, -1);
        // print();
    }

    public boolean insertFront(int value) {
        if (isFull())
            return false;
        frontIdx = (size + frontIdx - 1) % size;
        q[frontIdx] = value;
        // print();
        return true;
    }

    public boolean insertLast(int value) {
        if (isFull())
            return false;
        lastIdx = (lastIdx + 1) % size;
        q[lastIdx] = value;
        // print();
        return true;
    }

    public boolean deleteFront() {
        if (isEmpty())
            return false;
        q[frontIdx] = -1;
        frontIdx = (frontIdx + 1) % size;
        // print();
        return true;
    }

    public boolean deleteLast() {
        if (isEmpty())
            return false;
        q[lastIdx] = -1;
        lastIdx = (size + lastIdx - 1) % size;
        // print();
        return true;
    }

    public int getFront() {
        return q[frontIdx];
    }

    public int getRear() {
        return q[lastIdx];
    }

    public boolean isEmpty() {
        return (size + lastIdx - frontIdx) % size == size - 1 && q[frontIdx] == -1;
    }

    public boolean isFull() {
        return (size + lastIdx - frontIdx) % size == size - 1 && q[frontIdx] != -1;
    }

    // private void print() {
    //     System.out.println(Arrays.toString(q) + "\t" + frontIdx + "\t" + lastIdx);
    // }
}

/**
 * Your MyCircularDeque object will be instantiated and called as such:
 * MyCircularDeque obj = new MyCircularDeque(k);
 * boolean param_1 = obj.insertFront(value);
 * boolean param_2 = obj.insertLast(value);
 * boolean param_3 = obj.deleteFront();
 * boolean param_4 = obj.deleteLast();
 * int param_5 = obj.getFront();
 * int param_6 = obj.getRear();
 * boolean param_7 = obj.isEmpty();
 * boolean param_8 = obj.isFull();
 */