Formatted question description: https://leetcode.ca/all/622.html

# 622. Design Circular Queue

## Level

Medium

## Description

Design your implementation of the circular queue. The circular queue is a linear data structure in which the operations are performed based on FIFO (First In First Out) principle and the last position is connected back to the first position to make a circle. It is also called “Ring Buffer”.

One of the benefits of the circular queue is that we can make use of the spaces in front of the queue. In a normal queue, once the queue becomes full, we cannot insert the next element even if there is a space in front of the queue. But using the circular queue, we can use the space to store new values.

Your implementation should support following operations:

`MyCircularQueue(k)`

: Constructor, set the size of the queue to be k.`Front`

: Get the front item from the queue. If the queue is empty, return -1.`Rear`

: Get the last item from the queue. If the queue is empty, return -1.`enQueue(value)`

: Insert an element into the circular queue. Return true if the operation is successful.`deQueue()`

: Delete an element from the circular queue. Return true if the operation is successful.`isEmpty()`

: Checks whether the circular queue is empty or not.`isFull()`

: Checks whether the circular queue is full or not.

**Example:**

```
MyCircularQueue circularQueue = new MyCircularQueue(3); // set the size to be 3
circularQueue.enQueue(1); // return true
circularQueue.enQueue(2); // return true
circularQueue.enQueue(3); // return true
circularQueue.enQueue(4); // return false, the queue is full
circularQueue.Rear(); // return 3
circularQueue.isFull(); // return true
circularQueue.deQueue(); // return true
circularQueue.enQueue(4); // return true
circularQueue.Rear(); // return 4
```

**Note:**

- All values will be in the range of [0, 1000].
- The number of operations will be in the range of [1, 1000].
- Please do not use the built-in Queue library.

## Solution

Use an array to act as a queue and store the elements. Besides the array that is a data field of the class `MyCircularQueue`

, the other data fields include `capacity`

which is the capacity of the queue, `start`

and `end`

which are the indices of the first element and the last element, and `size`

which is the number of elements in the queue.

For the constructor, given capacity `k`

, initialize the array to be an array of length `k`

and filled with -1, set `capacity = k`

, and set `start`

, `end`

and `size`

to 0.

For method `enQueue`

, return `false`

if the queue is full (checked by calling `isFull`

). If `size == 0`

, then set both `start`

to `end`

to 0. Otherwise, move `end`

one step forward (note that the queue is circular, so if `end`

was previously `capacity - 1`

, then `end`

will become 0 after moving one step forward). Set the element at index `end`

in the array to be the given value, increase `size`

by 1, and return `true`

.

For method `deQueue`

, return `false`

if the queue is empty (checked by calling `isEmpty`

). Set the element at index `start`

to -1, move `start`

one step forward (note that the queue is circular, so if `start`

was previously `capacity - 1`

, then `start`

will become 0 after moving one step forward), decrease `size`

by 1, and return `true`

.

For method `Front`

, return the element at index `start`

.

For method `Rear`

, return the element at index `end`

.

For method `isEmpty`

, return `true`

if and only if `size == 0`

.

For method `isFull`

, return `true`

if and only if `size == capacity`

.