[ 자료구조 ] Queue

큐의 개념

  • 선입 선출, FIFO 구조(First In First Out)

image

 


 

큐의 특성을 활용하는 분야

먼저 들어온 것을 먼저 처리하는 큐의 동작 방식은 주로 여러 이벤트가 발생했을 때 발생한 순서대로 처리할 때 활용됨

  • 작업 대기열 : 네트워크 통신을 할 때 다수의 클라이언트에서 서버에 작업을 요청하면 서버는 요청이 들어온 순서대로 작업을 처리
  • 이벤트 처리 : 어떤 애플리케이션이나 시스템에서 사용자의 이벤트, 즉 키보드 입력이나 마우스 움직임을 처리할 때

 


 

큐의 ADT

ADT (Abstract Data Type, 추상 데이터 타입) : 데이터의 구현 방법을 명시하지 않고, 해당 데이터가 가져야 할 연산들을 정의 한 것 , 데이터 타입이 가져야 할 기능(메소드)들의 명세서

 

구분 정의 설명
연산 boolean isFull() 큐에 들어있는 데이터 개수가 maxsize인지 확인
  boolean isEmpty() 큐에 들어있는 데이터가 없는 지 확인
  void add(ItemType item) 큐에 데이터를 add
  ItemType poll() 큐에서 최근에 add 한 데이터를 꺼내고 반환
상태 int front 큐에서 가장 마지막에 poll한 위치를 기록
  int rear 큐에서 최근에 add한 데이터의 위치를 기록
  ItemType data[maxsize] 큐의 데이터를 관리하는 배열, maxsize개의 데이터 관리

image 1

 

1 단계 : isFull , add

image 2

1️⃣ isFull() 연산으로 현재 큐가 가득 찼는지 확인하고 큐가 가득 차지 않았으므로

2️⃣ rear을 +1 한 후 rear가 가리키는 위치에

3️⃣ 3을 add 함 (반대로 isFull 인 ture이면 데이터를 add하지 않음)

 

2 단계 : poll

image 3

1️⃣ isEmpty() 연산으로 큐가 비었는지 확인, front와 rear의 값이 같은지 확인해서 큐에 원소가 없는데 poll하는 동작을 방지함

2️⃣ 만약 비어있지 않다면(isEmpty가 false) front를 +1 하면 front와 rear가 0으로 같아지게 되고

3️⃣ isEmpty() 연산 시 큐가 빈 것(isEmpty가 true)으로 처리되어 실제 배열의 데이터를 삭제하지 않고도 데이터를 삭제한 것처럼 관리 가능

3 단계 : 계속해서 add

image 4

1️⃣ 5를 add하면 isFull() 연산을 수행해 큐가 가득 찼는지 검사하고, 가득차지 않았다면 add

2️⃣ 계속해서 같은 방식으로 6, 8을 add하면 front는 0, rear은 3이 됨

 

4 단계 : 가득찬 상태에서 add

image 5

1️⃣ rear가 3이므로 maxsize-1과 같게 되므로

2️⃣ isFull() 연산은 true으므로 add하지 못하게 됨

 


 

큐 구현

1. Queue의 인터페이스 활용하기

자바 컬렉션 프레임워크에서 Queue의 구현체로 사용하는 클래스는 ArrayDeque, LinkedList가 있음

  • add 연산 : add()
  • poll 연산 : poll()

 

image 6

 

import java.util.Queue;
import java.util.ArrayDeque;

// 큐를 구현한 ArrayDeque 객체 생성
Queue<Integer> queue = new ArrayDeque<>();

// 큐에 데이터 추가
queue.add(1);
queue.add(2);
queue.add(3);

// 큐의 맨 앞 데이터를 제거하면서 반환
int first = queue.poll();
System.out.println(first); // 1

// 큐에 데이터 추가
queue.add(4);
queue.add(5);

// 큐의 맨 앞 데이터를 제거하면서 반환
first- queue.poll();
System.out.println(first); // 2

 

2. 덱(ArrayDeque) 클래스 활용하기

Deque(Double Ended Queue) 은 양 끝에서 삽입 또는 삭제할 수 있는 큐를 구현한 것

  • add 연산 : add() / addLast()
  • poll 연산 : poll() / pollFirst()

image 7

 

import java.util.ArrayDeque;

// 큐를 구현한 ArrayDeque 객체 생성
ArrayDeque<Integer> queue = new ArrayDeque<>();

// 큐에 데이터 추가
queue.addLast(1);
queue.addLast(2);
queue.addLast(3);

// 큐의 맨 앞 데이터를 제거하면서 반환
int first = queue.pollFirst();
System.out.println(first); // 1

// 큐에 데이터 추가
queue.addLast(4);
queue.addLast(5);

// 큐의 맨 앞 데이터를 제거하면서 반환
first- queue.pollFirst();
System.out.println(first); // 2

'코딩테스트 > 개념정리' 카테고리의 다른 글

[ 알고리즘 ] 재귀(Recursion)  (0) 2025.04.25
[ 자료구조 ] Hash  (0) 2025.04.20
[ 자료구조 ] 배열  (0) 2025.01.13
[ 알고리즘 ] Dijkstra Algorithm  (0) 2025.01.08
[ 알고리즘 ] BackTracking  (0) 2024.12.30