본문 바로가기

Data Structure

[Java] 큐(Queue)

큐(Queue)의 개념

 - 스택과는 다르게 먼저 들어온 데이터가 먼저 나가는 FIFO( First In First Out)로 저장하는 자료 구조이다.

 - 데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에 유리하다.

 

큐(Queue)의 기본 메서드 4가지

1. add(item) : item을 리스트의 마지막에 추가한다.

2. remove() : 리스트의 첫 번째 항목을 제거한다.

3. peek()    : 큐의 가장 첫 번째 항목을 반환한다.

4. isEmpty() : 큐가 비어있을 경우 true를 반환한다.

 

Java API 에서 큐(Queue)의 FIFO 처리 시 유사한 메서드들의 차이점

  예외 발생 값 반환
추가(Enqueue) add(item) offer(item)
삭제(Dequeue) remove() poll()
검사(Peek) element() peek()

위의 표를 예로 들면 add,remove,element의 경우 예외를 발생시키지만 offer, poll, peek은 true, false를 반환한다.

 

큐(Queue)의 사용 사례

  • 너비 우선 탐색 (BFS, Breath-First Search)
  • 캐시(Cache) 구현 - LRU 알고리즘을 주로 확인
  • 게임 매칭 시스템
  • 프린터의 출력 처리

큐(Queue)의 구현

큐(Queue)의 구현에는 다양한 방법이 있다. 선형 큐,  환형 큐 , 링크드리스트를 이용한 큐 등의 다른 블로그들이 정리해놓은 것이 있지만 동작 원리는 front, rear를 통해 Insertion 연산 일 때 rear가 증가하고 Deletion 연산 일 때 front가 증가하며 데이터를 저장하는 것이다.

 

아래 소스는 Youtube 엔지니어대한민국님의 Queue 구현하기 in java에서 사용된 코드이다.

 

class Queue<T> // 객체를 만들 때 데이터 타입을 명시 하도록 선언
{    
    class Node<T>{
        private T data;
        private Node<T> next;
        
        public Node(T data) {
            this.data = data;
        }        
    }
    
    private Node<T> first;
    private Node<T> last;
    
    public void add(T item) {
        Node<T> t = new Node<>(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;
    }
}

 

 

 

 

'Data Structure' 카테고리의 다른 글

[Java] 스택(Stack)  (0) 2021.06.22