class Queue {
constructor() {
this.queue = [];
this.front = 0;
this.rear = 0;
}
enqueue(value) {
this.queue[this.rear++] = value;
}
dequeue() {
const value = this.queue[this.front];
delete this.queue[this.front];
this.front += 1;
return value;
}
peek() {
return this.queue[this.front];
}
size() {
return this.rear - this.front;
}
}
const queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);
console.log(queue.dequeue());
queue.enqueue(5);
console.log(queue.size());
console.log(queue.peek());
=> 배열을 활용하여 큐를 구현하였다. 앞과 뒤 인덱스를 각 로직을 수행하면서 갱신하는 것이 중요하다. 이렇게 구현을 해야 효율적이다. shift함수는 비효율적이다. (n이 커질 경우에)
class CircularQueue {
constructor(maxSize) {
this.maxSize = maxSize;
this.queue = [];
this.front = 0;
this.rear = 0;
this.size = 0;
}
enqueue(value) {
if (this.isFull()) {
console.log('Queue is Full!');
return;
}
this.queue[this.rear] = value;
this.rear = (this.rear + 1) % this.maxSize;
this.size += 1;
}
dequeue() {
const value = this.queue[this.front];
delete this.queue[this.front];
this.front = (this.front + 1) % this.maxSize;
this.size -= 1;
return value;
}
isFull() {
return this.size === this.maxSize;
}
peek() {
return this.queue[this.front];
}
}
const queue = new CircularQueue(4);
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);
queue.enqueue(5);
console.log(queue.dequeue());
console.log(queue.dequeue());
console.log(queue.size);
console.log(queue.peek());
queue.enqueue(16);
queue.enqueue(32);
console.log(queue.isFull());
=> 환형큐는 최대 크기와 현재 크기를 별도로 가지고 있다. 그리고 엔큐와 디큐를 할 때 검증하면서 상태를 수정한다.