컴퓨터의 기본적인 자료구조의 한 가지로, 먼저 집어넣은 데이터가 먼저 나오는 FIFO(First In First Out) 구조로 저장되는 자료구조이다.
큐(Queue)는 FIFO(First In First Out)를 따른다.
- add(Object) : Object를 리스트의 끝 부분에 추가한다.
- remove() : 리스트의 첫 번째 항목을 삭제한다.
- peek() : 큐에서 가장 첫 번째 원소를 반환한다.
- isEmpty() : 큐가 비어있는지 아닌지를 판단한다. 큐가 비어있으면 true를 반환한다.
큐(Queue)는 연결리스트로 구현할 수 있다. 연결리스트의 반대방향에서 항목을 추가하거나 제거하도록 구현한다.
public class MyQueue {
private static class QueueNode {
private T data;
private QueueNode next;
public QueueNode(T data) {
this.data = data;
}
}
private QueueNode first;
private QueueNode last;
public void add(T item) {
QueueNode t = new QueueNode(item);
if (last != null) last.next = t;
last = t;
if (first == null) first = last;
}
public T remove() {
if (first == null) throw new NoSuchElementException();
T data = first.data;
first = first.next;
if (first == null) last = null;
return data;
}
public T peek() {
if (first == null) throw new NoSuchElementException();
return first.data;
}
public boolean isEmpty() {
return first == null;
}
}데이터가 입력된 시간 순서대로 처리해야할 필요가 있는 상황에 이용한다.
- 너비우선탐색(BFS, Breadth-First Search) 구현
- 캐시(Cache) 구현
- 우선순위가 같은 작업 예약(인쇄 대기열)
- 선입선출이 필요한 대기열(티켓 카운터)
- 콜센터 고객 대기시간
- 프린터의 출력 처리
- 윈도우 시스템의 메시지 처리기
- 프로세스 관리
- 수행이 실패했을 때 exception을 발생시키는 메서드
- add(e), element(), remove()
- 수행이 실패했을 때 null 또는 false를 반환하는 메서드
- offer(e), peek(), poll()
- boolean add(E item)
- 해당 item을 Queue에 삽입한다.
- 삽입에 성공하면 true를 반환하고, 큐에 더이상 자료를 넣을 공간이 없는 경우에 예외(IllegalStateException)을 발생시킨다.
- E element()
- Queue에 Head에 있는 item을 삭제하지 않고 해당 item을 반환한다.
- 만약 Queue가 비어있다면 예외(NoSuchElementException)을 발생시킨다.
- E remove()
- Queue의 Head에 있는 item을 삭제하고 해당 item을 반환한다. 즉, Queue의 Head에 있는 요소를 꺼내는 연산이다.
- 만약 Queue가 비어있다면 예외(NoSuchElementException)을 발생시킨다.
- boolean offer(E item)
- add(E item)과 동일한 기능을 수행한다.
- 다른점은 삽입에 성공하면 true를 반환하고, 실패하면 예외를 발생시키지 않고 false를 반환한다는 점이다.
- E peek()
- element()와 동일한 기능을 수행한다.
- 다른점은 Queue가 비어있다면 예외를 발생시키지 않고 null을 반환한다는 점이다.
- E poll()
- remove()와 동일한 기능을 수행한다.
- 다른점은 Queue가 비어있으면 예외를 발생시키지 않고 null을 반환한다는 점이다.
- 일반적인 큐(Queue) 사용
일반적인 큐(Queue)를 사용할 때는 Queue 자체가 인터페이스이기 때문에 다형성을 이용하여 연결리스트로 큐를 구현한다.
Queue<E> queue = new LinkedList<>();- 우선순위 큐(Priority Queue) 사용
우선순위 큐(Queue)를 사용할 때는 PriorityQueue 클래스를 이용해서 큐를 구현한다.
Queue<E> pq = new PriorityQueue<>();