자료구조

[자료구조] Queue에 대하여

Dodledd 2024. 2. 17. 19:05

간단하게 큐(Queue) 는 무엇일까?

우리가 맛집에 줄을서게되면 한 줄로 쭉 서게 되는데 그럼 먼저 줄을 선 사람이 먼저 먹게되겠죠? 아니면

편의점에서 음료를 살 때 음료들이 한 줄로 쭉 이어져있죠?? 이것과 유사한 개념입니다.[각주:1]

 

큐(Queue)의 개념

위에서 설명드린 것처럼 편의점에 음료가 쭉 이어져 있을 때 우리는 가장 앞에 있는 음료를 집게되고 음료가 빠지면 편의점 사장님이 음료를 넣어서 채워놓을 겁니다.

이렇게 먼저 들어간 자료가 먼저 나오는 구조를 FIFO(First in First Out) 이라고합니다.

한국말로는 선입선출이겠죠?

 

 

Queue(큐)의 특징

  1. 선입선출, FIFO구조이다.
  2. 큐의 제일 앞 쪽은 front이며 삭제 연산만 수행한다.
  3. 큐의 제일 뒤 쪽은 rear이며 삽입 연산만 수행한다.
  4. 입력이 많이 밀려올 때 처리하기 힘들면 버퍼를 만들어 대기 시킨다.

 

 

Queue(큐)의 사용법

import java.util.LinkedList; 
import java.util.Queue;
Queue<Integer> queue = new LinkedList<>();

 

자바에서 큐를 사용하려면

  1. LinkedList를 이용해야한다.
  2. Queue도 이용해야한다.
  3. 결론 -> 둘 다 import해야 사용할 수 있다.

Queue(큐)에 값 추가하기

.add()

.offer()

Queue<Integer> queue = new LinkedList<>();
queue.add(1);    
queue.add(2);   
queue.offer(3);

값을 추가하기위해 사용되는 메소드는 두 가지가 있는데 기능적 차이는 없다. 하지만 문제가 생겼을 때 반환하는 값이 다르다.

문제상황 발생 = 큐가 꽉 차서 값 추가에 실패했을 때

  • .add() : 문제상황 발생 시 예외를 던짐 (에러발생)
  • offer() : 문제상황 발생 시 false를 리턴함.

Queue(큐)에 값 삭제하기

.poll()

.remove()

Queue<Integer> queue = new LinkedList<>(); 
queue.offer(1); //추가    
queue.offer(2); //추가
queue.offer(3); //추가   
queue.poll();   //삭제    
queue.remove(); //삭제

값을 삭제하기 위해 사용되는 메소드도 두 가지가 있는데 마찬가지로 기능적 차이는 없지만 반환 값에 차이가 있다.

문제상황 발생 = 삭제를 실패했을 때(큐가 비어있을 때)

  • .remove() : 문제상황 발생 시 예외 발생함.
  • .poll() : 문제상황 발생 시 null을 반환함.

Queue(큐)에 모든 값 삭제

.clear()

queue.clear();

모든 값을 삭제하기 위해서는 .clear()을 사용해주면 된다.

 

Queue에서 가장 먼저 들어간 값 알아내기

.element()

.peek()

queue.peek();
queue.element();

peek,  element 메소드를 사용하면 첫번째로 저장된 값의 참조 값을 가져옵니다.

  • .element() : 문제상황 발생 시 예외 발생시킴
  • .peek() : 문제상황 발생 시 null반환

 

 

 

 

 

오늘은 Queue(큐)에 대해 알아보았다. 어찌보면 우리에게 익숙한 개념이고 저번에 공부했었던 Stack과 반대의 개념을 가지고 있다고 말할 수 있을 것 같다.

다음엔 Queue를 사용하는 알고리즘인 BFS에 대해 공부해보도록 하겠다!

  1. 사전적 의미로는 무엇을 기다리는 사람 또는 줄을 서서 기다리는 것 [본문으로]