ํ(Queue)๋?
ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ผ์์ ์ผ๋ก ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ ์ค ํ๋๋ก, ๋จผ์ ์ ๋ ฅ๋ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ์ถ๋ ฅ๋๋ "์ ์ ์ ์ถ(FIFO: First-In-First-Out)" ์์น์ ๋ฐ๋ฆ ๋๋ค.
ํ(Queue)์ ๊ตฌํ ๋ฐฉ๋ฒ 2๊ฐ์ง
ํ๋ ๋ฐฐ์ด(Array)์ด๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Linked List)๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์์ต๋๋ค.
1๏ธโฃ ๋ฐฐ์ด
๋ฐฐ์ด์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋์ด ์์ด์ ๋ฐ์ดํฐ์ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ์ ์ ํ์ด ์์ ์ ์์ง๋ง, ์ฐ์ฐ ์๋๊ฐ ๋น ๋ฆ ๋๋ค.
2๏ธโฃ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ํฌ๊ธฐ์ ์ ํ์ด ์์ด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋์ ์ผ๋ก ์ถ๊ฐ ๋ฐ ์ ๊ฑฐํ ์ ์์ง๋ง, ์ฐ์ฐ ์๋๊ฐ ๋๋ฆฝ๋๋ค.
๐ง ๋ฐฐ์ด๋ก ํ(Queue)๋ฅผ ๊ตฌํํด๋ ๋์ง๋ง ๊ตณ์ด ? ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌํํด์ผ ํ๋ ์ด์
JavaScript์์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ํ(Queue)๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๊ฐ๋ฅํ์ง๋ง, ๋ฐฐ์ด์ ๋งจ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ๋นํจ์จ์ ์ ๋๋ค. ์ด๋ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ํ ์นธ์ฉ ์ด๋์์ผ์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. (์๊ฐ ๋ณต์ก๋ O(n)) ๋ฐ๋ฉด์ ์คํ(Stack)์ ๋ฐฐ์ด์ ๋งจ ๋์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ฐ ์ ๊ฑฐํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
๐ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ํ(Queue) ๊ตฌํํ๋ ๋ฐฉ๋ฒ
class Node {
constructor(data) {
// ๋
ธ๋ ๊ฐ
this.data = data;
// ๋ค์ ๋
ธ๋์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅ
this.next = null;
}
}
class Queue {
constructor() {
// ํ์ ์ฒซ ๋ฒ์งธ ๋
ธ๋
this.head = null;
// ํ์ ๋ง์ง๋ง ๋
ธ๋
this.tail = null;
// ํ์ ๊ธธ์ด
this.size = 0;
}
enqueue(data) {
// ์๋ก์ด ๋
ธ๋ ์์ฑ
const newNode = new Node(data);
// ํ๊ฐ ๋น์ด์์ ๊ฒฝ์ฐ head์ tail์ ๋ชจ๋ ์ ๋
ธ๋๋ก ์ค์
// ๊ทธ๋ ์ง ์์ผ๋ฉด ํ์ฌ tail์ next ์์ฑ์ ์ ๋
ธ๋๋ก ์ค์ ํ๊ณ tail์ด ์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์
๋ฐ์ดํธ
if (!this.head) {
this.head = newNode;
this.tail = newNode;
} else {
this.tail.next = newNode;
this.tail = newNode;
}
this.size++;
}
dequeue() {
// ํ๊ฐ ๋น์ด์์ ๊ฒฝ์ฐ null ๋ฐํ
// ๊ทธ๋ ์ง ์์ผ๋ฉด head๋ฅผ ํ์ ๋ ๋ฒ์งธ ์์๋ก ์ค์ ํ๊ณ ์ ๊ฑฐ๋ ๋
ธ๋์ data๋ฅผ ๋ฐํ
if (!this.head) {
return null;
}
const removeNode = this.head;
this.head = this.head.next;
if (!this.head) {
this.tail = null;
}
this.size--;
return removeNode.data;
}
// ํ๊ฐ ๋น์ด์์ ๊ฒฝ์ฐ true ๋ฐํ, ๊ทธ๋ ์ง ์์ผ๋ฉด false ๋ฐํ
isEmpty() {
return this.size === 0;
}
}
const Q = new Queue();
Q.enqueue(1);
Q.enqueue(2);
Q.dequeue();
console.log(Q);
๐ง๐ป๐ป ๋๋จํ ์ค๋ ฅ์๊ฐ ์๋ ๊ณต๋ถ๋ฅผ ํ๊ณ ์๋ ์ทจ์ค์์ ๋๋ค. ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ๊ณผ๊ฐํ๊ฒ ๋๊ธ๋ก ํผ์ญ๋ด์ฃผ์๊ธฐ ๋ฐ๋๋๋คโ๏ธ
'Frontend > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Axios] Axios ์ธํฐ์ ํฐ ์ ์ฉํ๊ธฐ (0) | 2023.05.10 |
---|---|
[JavaScript] ์ ๊ท ํํ์ ์์ ๋์ ์ผ๋ก ๋ณ์๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ (1) | 2023.04.23 |
[JavaScript] ํ๋ฒ์ ํ๋ ๋ฐฐ์ด ์์ฑ & ์ด๊ธฐํ (0) | 2022.09.28 |
[JavaScript] ์ค์ฝํ(Scope)๋ ๋ฌด์์ธ๊ฐ? (0) | 2022.09.05 |
[JavaScript] ํด๋ก์ ๋ ๋ฌด์์ธ๊ฐ? (0) | 2022.09.02 |