Array로 구현하는 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Queue {
constructor() {
this.queue = [];
this.front = 0;
this.rear = 0;
}

enqueue(value) {
const 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;
}
}

list로 구현하는 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}

class Queue {
constructor() {
this.head = null;
this.tail = null;
this.size = 0;
}

enqueue(newValue) {
this.newNode = new Node(newValue);
if (this.head === null) {
this.head = newNode;
this.tail = newNode;
} else {
this.tail.next = newNode;
this.tail = newNode;
}
this.size += 1;
return value;
}

dequeue() {
const value = this.head.value;
this.head = this.head.next;
this.size = -1;
return value;
}

peek() {
return this.head.value;
}
}

Shift 함수는 쓰지말자!

shift 메서드를 사용하게 되면 배열의 index를 하나씩 당겨서 다시 정리해야하기 때문에 시간복잡도가 증가한다.

Circluar Queue

Front와 Rear가 이어져있는 Queue

Circluar Queue는 Linked List로 구현했을 때 이점이 없다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Queue {
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];
}