Create a Circular Queue
Problem Explanation
-
In this challenge we create a Circular Queue data structure.
-
First, we need to create an array of
size
with all elements set tonull
. -
Then we create an equeue method, which moves the write pointer but doesnt exceed the read pointer.
-
The dequeue method on the other hand, moves the read pointer but doesnt exceed the write pointer.
-
Example:
- First, we create an array of length 5:
[null, null, null, null, null]
^Read @ 0
^Write @ 0
- Then we enqueue
a
,b
, andc
:
[a, b, c, null, null]
^Read @ 0
^Write @ 3
- Now we dequeue all the enqueued items:
[null, null, null, null, null]
^Read @ 3
^Write @ 3
- Finally, we enqueue
d
,e
andf
:
[f, null, null, d, e]
^Read @ 3
^Write @ 1
Solutions
Solution 1 (Click to Show/Hide)
class CircularQueue {
constructor(size) {
this.queue = [];
this.read = 0;
this.write = 0;
this.max = size - 1;
while (size > 0) {
this.queue.push(null);
size--;
}
}
print() {
return this.queue;
}
enqueue(item) {
if (this.queue[this.write] === null) {
this.queue[this.write++] = item;
if (this.write > this.max) this.write = 0;
return item;
}
return null;
}
dequeue() {
if (this.queue[this.read] != null) {
let item = this.queue[this.read];
this.queue[this.read++] = null;
if (this.read > this.max) this.read = 0;
return item;
}
return null;
}
}
Relevant Links
Solution 2 (Click to Show/Hide)
class CircularQueue {
constructor(size) {
this.queue = [];
this.read = 0;
this.write = 0;
this.max = size - 1;
while (size > 0) {
this.queue.push(null);
size--;
}
}
print() {
return this.queue;
}
enqueue(item) {
// Only change code below this line
if (this.write >= this.read + this.max + 1) return null;
this.queue[this.write % (this.max + 1)] = item;
this.write++;
return item;
// Only change code above this line
}
dequeue() {
// Only change code below this line
if (this.read >= this.write) return null;
const item = this.queue[this.read % (this.max + 1)];
this.queue[this.read % (this.max + 1)] = null;
this.read++;
return item;
// Only change code above this line
}
}