큐(Queue)
는 stack과 마찬가지로 데이터를 일시적으로 저장하기 위해 사용하는 자료구조다.
한 쪽에서만 데이터의 삽입, 삭제가 이루어졌던 stack과 달리 Queue는 선입선출(FIFO: First In First Out)
방식으로 양쪽 끝에서 데이터의 삽입과 삭제가 각각 이루어진다.
큐(Queue)
는 다음과 같은 구조로 나누어서 진행된다.
rear
에서 삽입 연산이 수행되는 기능front
에서 삭제 연산이 수행되는 기능먼저 들어간 데이터가 제일 처음에 나오는 선입선출의 구조로 되어있다.
Queue는 데이터의 입력, 출력 방향이 다르다. 데이터를 입력할 때는 큐의 맨 끝(tail)으로만 입력이 가능하며, 데이터를 출력할 때는 큐의 맨 앞(head)으로만 출력이 가능하다.
즉, 큐는 데이터를 입력하는 곳과 출력하는 곳이 각각 정해져 있으며 총 2개의 입출력 방향을 가지고 있다. 만약 입출력 방향이 같다면 Queue 자료구조로 볼 수 없다.
Queue는 데이터를 넣을 때는 큐의 맨 뒷 부분에서 뺄 때는 큐의 맨 앞부분에서 처리를 진행한다. 각 처리 시마다 한 개의 데이터를 넣거나 뺄 수 있다.
즉, 큐에 한 개씩 여러 번 데이터를 넣어 큐 내부에 데이터가 여러 개 쌓여 있다고 하더라도, 데이터를 뺄 때는 큐의 맨 앞에서 한 번에 한 개의 데이터만을 뺄 수 있다.
컴퓨터(출력 버튼) -> (임시 기억 장치의) Queue에 하나씩 들어옴 -> Queue에 들어온 문서를 들어온 순서대로 인쇄
만약 Queue에 들어온 순서대로 출력하지 않는다면, 인쇄 결과물이 뒤죽박죽일 것이다.
이러한 예시처럼 컴퓨터 장치들 사이에서 데이터(data)를 주고받을 때, 각 장치 사이에서 존재하는 속도의 차이나 시간 차이를 극복하기 위해 임시기억 장치의 자료구조로 Queue를 사용한다. 이것을 통틀어 버퍼(buffer)
라고 한다.
대부분의 컴퓨터 장치에서 발생하는 이벤트는 파동 그래프와 같이 불규칙적으로 발생한다. 이에 비해 CPU와 같이 발생한 이벤트를 처리하는 장치는 일정한 처리 속도를 갖는다.
불규칙적으로 발생한 이벤트를 규칙적으로 처리하기 위해 버퍼(buffer)를 사용한다.
JavaScript에서는 Queue
라이브러리를 지원해주지 않는다.
큐를 배열로 구현하게 되면, push와 shift, unshift와 pop로 구현할 수 있다. 하지만, 이 두 가지 쌍 모두 한 쪽에서는 꺼내든 집어 넣든 인덱스를 다시 조정해야된다는 불편함이 있다.
배열로 구현하기에는 인덱스 조정을 불필요하게 작성해줘야하므로, 연결리스트를 구현하는 걸 권장한다.
class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}
class Queue {
constructor() {
this.first = null;
this.last = null;
this.size = 0;
}
// 데이터 삽입
enqueue(value) {
let newNode = new Node(value);
if (!this.first) {
this.first = newNode;
this.last = newNode;
} else {
this.last.next = newNode;
this.last = newNode;
}
return ++this.size;
}
// 데이터 삭제
dequeue() {
if (!this.first) return null;
let temp = this.first;
if (this.first === this.last) {
this.last = null;
}
this.first = this.first.next;
this.size--;
return temp.value;
}
// 데이터 출력
print() {
let current = this.first;
while (current) {
console.log(current.value);
current = current.next;
}
}
}
const queue = new Queue();
queue.enqueue(0);
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);
queue.dequeue();
queue.print();
/**
1
2
3
4
*/
Queue
는 순서대로 처리해야 하는 작업을 임시로 저장해두는 버퍼(buffer)로서 많이 사용된다.
FIFO
이다.Reference
[자료구조] 스택(Stack)과 큐(Queue)에 대해서 알아보자!
[Javascript] Stack, Queue / Javascript Queue 구현해야 하는 이유
CODESTATES (SEB_FE_43)