CS/자료구조

[자료구조] 10. 큐

JIN-JJS 2025. 3. 31. 19:25

1. 큐의 개념

1) 큐 (Queue)

• 큐는 일상생활에서 흔히 볼 수 있는 자료구조로, 먼저 들어온 데이터가 먼저 나가는 선입선출(FIFO: First-In First-Out) 구조를 가진다.

 

큐의 특징

• 스택과 유사하지만, 삽입과 삭제가 서로 다른 위치에서 수행됨

• 삽입은 rear에서, 삭제는 front에서 이루어짐

• frontrear라는 두 개의 포인터를 사용

 

큐의 예시

• 신호등 앞에서 줄 서 있는 자동차

• 키보드 입력 시 버퍼 메모리에 저장되는 문자들

• 프린터 인쇄 대기열

 

 

2) 큐의 주요 동작

삽입 연산 (Enqueue)

• rear 포인터가 가리키는 위치에 원소 삽입

• 삽입 후 rear 증가

 

삭제 연산 (Dequeue)

• front 포인터가 가리키는 위치의 원소 삭제

• 삭제 후 front 증가

 

 

3) 큐의 추상 자료형 (ADT)

큐의 연산

• enqueue(x): 큐의 rear 위치에 데이터 x 삽입

• dequeue(): 큐의 front 위치에서 데이터 삭제 후 반환

• isEmpty(): 큐가 비어있는지 확인

• isFull(): 큐가 가득 찼는지 확인

 

 

4) 스택과 큐의 연산 비교

• 스택: 삽입(push)과 삭제(pop)이 top에서 이루어짐

• 큐: 삽입(enqueue)은 rear에서, 삭제(dequeue)는 front에서 이루어짐

 

 

5) 큐의 삽입과 삭제 과정

연산 과정 예시

(1) 공백 큐 생성: createQueue();

(2) A 삽입: enqueue(Q, A);

(3) B 삽입: enqueue(Q, B);

(4) 삭제 (A 제거): dequeue(Q);

(5) C 삽입: enqueue(Q, C);

(6) 삭제 (B 제거): dequeue(Q);

(7) 삭제 (C 제거): dequeue(Q);


6) 큐의 알고리즘

(1) 공백 상태 검사

isEmpty(Q) {
  if (front == rear) return true;
  else return false;
}

 

(2) 포화 상태 검사

isFull(Q) {
  if (rear == n-1) return true;
  else return false;
}

 

(3) 삽입 연산 (Enqueue)

enqueue(Q, x) {
  if (isFull(Q)) queue_full();
  else {
    rear = rear + 1;
    Q[rear] = x;
  }
}

 

(4) 삭제 연산 (Dequeue)

dequeue(Q) {
  if (isEmpty(Q)) queue_empty();
  else {
    front = front + 1;
    return Q[front];
  }
}

 

 

 

7) 순환 큐 (Circular Queue)와 포화 상태 문제

순차 큐의 문제점

• 큐의 삽입과 삭제가 반복되면 frontrear가 증가하여, 배열이 비어 있어도 큐가 꽉 찬 것처럼 인식되는 문제 발생

 

해결 방법

• 기존 원소를 배열의 앞부분으로 이동시키는 방법이 있지만, 비효율적

• 원형 큐 (Circular Queue) 사용하여 해결

- rear가 끝까지 가면 다시 처음으로 순환

- 공간 낭비 없이 효율적인 큐 관리 가능


이 내용은 휴넷사회복지평생교육원의 자료구조 강의를 듣고 정리한 것입니다.