내 맘대로 공부
article thumbnail
Published 2023. 3. 18. 20:22
[ 자료구조 ] Queue CS/자료구조

📌 Queue ( 큐 )

큐(Queue)는 '줄을 서서 기다리다, 대기행렬' 이라는 뜻을 가지고 있다.

실생활에서의 큐를 찾아보자면 가장 쉽게 대기줄을 생각할 수 있다. 대기줄에서 가장 중요한 것은 '순서'이다. 

톨게이트에 진입하는 차량을 생각해보면 도착한 순서대로 톨게이트를 나가는 모습이 바로 큐이다. 

이 때 톨게이트 자체가 큐를 의미하고, 각 차량들이 데이터를 의미한다. 

 

 

Queue의 구조

자료구조 Queue는 실생활 예시만 봐도 Stack과 반대되는 개념인 것을 알 수 있을 것이다. 

한 곳으로만 데이터 입출력이 이루어지는 것이 Stack이었다면, Queue는 두 개의 방향으로  입출력이 '순서대로' 이루어진다.

 

  • 먼저 들어간 데이터(data)가 먼저 나오는 FIFO(First In First Out) 혹은 LILO(Last In Last Out)의 특징.
  • 입력의 방향과 출력의 방향이 각각 고정되어 있으며, 데이터를 입력할 시에는 큐의 끝에서(tail), 데이터를 출력할 때는 큐의 맨 앞에서(head) 진행.
  • Queue에 데이터를 넣는 것을 'enqueue', 데이터를 꺼내는 것을 'dequeue'.

 

 

Queue의 특징

#01. FIFO (First In First Out)

먼저 들어간 데이터가 제일 처음에 나오는 선입선출의 구조로 되어 있다. 

위의 사진을 설명해보면, 1,2,3,4 순서대로 데이터가 입력되면 출력되는 순서 또한 1,2,3,4로 동일하다. 즉 입력 순서와 출력 순서가 동일한 특징을 갖고 있다.

 

#02. 두 개의 입출력 방향

Queue 자료구조는 데이터의 입력, 출력 방향이 다르다. 데이터를 입력할 때는 큐의 맨 끝(tail)으로만 입력이 가능하며 데이터를 출력할 때는 큐의 맨 앞(head)으로만 출력이 가능합니다. 즉, 큐는 데이터를 입력하는 곳과 출력하는 곳이 각각 정해져 있으며 이렇게 총 2개의 입출력 방향을 가지고 있습니다. 만약 입출력 방향이 같다면 Queue 자료구조라고 볼 수 없습니다.

 

#03. 데이터는 하나씩 

앞서 말했듯, Queue 자료구조는 데이터를 넣을 때는 큐의 맨 뒷 부분에서 뺄 때는 큐의 맨 앞부분에서 처리를 진행한다. 각 처리 시마다 한 개의 데이터를 넣거나 뺄 수 있다. 즉, 큐에 한 개 씩 여러 번 데이터를 넣어 큐 내부에 데이터가 여러 개 쌓여 있다고 하더라도, 데이터를 뺄 때는 큐의 맨 앞에서 한 번에 한 개의 데이터만을 뺄 수 있다. 이는 stack과 동일한 특징이다.

 

 

Queue의 실사용 예제

자료구조 Queue는 컴퓨터에서도 광범위하게 활용됩니다. 컴퓨터와 연결된 프린터에서 여러 문서를 순서대로 인쇄하는 데에 큐를 찾을 수 있다. 

  1. 우리가 문서를 작성하고 출력 버튼을 누르면 해당 문서는 인쇄 작업 (임시 기억 장치의) Queue에 입력.
  2. 프린터는 인쇄 작업 Queue에 들어온 문서를 들어온 순서대로 인쇄(출력).

만약 Queue에 들어온 순서대로 출력하지 않는다면, 인쇄 결과물이 뒤죽박죽일 것이다.

위 예시처럼 컴퓨터 장치들 사이에서 데이터(data)를 주고받을 때, 각 장치 사이에 존재하는 속도의 차이시간 차이극복하기 위해 임시 기억 장치의 자료구조로 Queue를 사용합니다. 이것을 통틀어 버퍼(buffer)라고 합니다. 아래 이미지는 버퍼링(buffering)의 개념을 보여주고 있다.

 

 

Queue 구현

- 클래스를 이용한 Queue 구현

class Queue {
  constructor() {
    this.storage = {};
    this.front = 0;
    this.rear = 0;
  }

  size() {
    return this.rear - this.front
  }
	
  enqueue(element) {
    this.storage[this.rear] = element;
    this.rear += 1;
  }
	
  dequeue() {
    if (this.size() <= 0) {
      return;
    }

    const result = this.storage[this.front];
    delete this.storage[this.front];
    this.front += 1;

    return result;
  }
}

 

- Array를 이용한 Queue 구현

const queue = [];

queue.push(1); // [1]
queue.push(2); // [1, 2]
queue.push(3); // [1, 2, 3]
queue.push(4); // [1, 2, 3, 4]
queue.push(5); // [1, 2, 3, 4, 5]

console.log(queue); // [1, 2, 3, 4, 5]

queue.shift(); // [2, 3, 4, 5]
queue.shift(); // [3, 4, 5]

console.log(queue); // [3, 4, 5]

'CS > 자료구조' 카테고리의 다른 글

[자료구조] Tree  (0) 2023.03.23
[자료구조] Stack  (0) 2023.03.18
profile

내 맘대로 공부

@곰도리도리잼

잘못된 정보가 있다면 알려주세요 🧸