자료구조

[자료구조] Queue란? from java

fiat_lux 2024. 4. 27. 00:40

Queue 란?  

  • Queue란? 사전적 의미로는 대기줄이다
  • 이러한 사전 적 의미 처럼 queue는 차례대로 처리된다
  • 큐는 후입선출(LIFO)인 스택과 다르게 선입선출(FIFO)의 형태를 가진다
  • 선입선출 말 그대로 먼저 들어오면 먼저 나가는 구조이다

Queue

 

특징


- FIFO (First In First Out) 구조 
- 큐의 한 쪽 끝은 front (앞)로 정하여 삭제 연산만 수행
- 다른 한 쪽 끝은 rear 로 정하여 삽입 연산만 수행
- 예를 들어 빨대 형태이다 한쪽으로 들어오고 다른 한쪽으로 나간다

 

 

사용법, 예제

import java.util.Queue;
import java.util.LinkedList;
Queue<T> queue = new LinkedList<>(); // T 타입 queue 선언


- 일단 java.util.Queue 클래스로부터 제공 받는다

 

 

값 추가 add(), offer()


Queue<Integer> queue = new LinkedList<>(); // int형 queue 선언

queue.offer(3);
queue.offer(5);
queue.add(1);
queue.add(4);

System.out.println(queue); // 출력 결과 : [3, 5, 1, 4]

 

- 위 코드 처럼 add(), offer() 메서드를 이용해서 queue에 값을 추가 할 수 있다
- 그렇다면 이 두 메서드의 차이점은 뭘까
- 이 add, offer 메서드는 둘다 queue에 값을 추가하는 기능을 가지는건 똑같다 
- 하지만 쉽게 말해 만약 큐의 용량이 초과 되었을때 add() 는 예외를 발생시키고 offer()는 false를 반환한다

Queue 클래스 java docs add(), offer()

 

- 위 사진 처럼 둘다 반환 값은 boolean 형태이다
- 하지만 위의 설명 처럼 add()는 if the element cannot be added at this time due to capacity restrictions (용량 제한으로 인해 현재 요소를 추가할 수 없는 경우)로 IllegalStateException를 던진다

 

 

값 삭제 poll(), remove()


Queue<Integer> queue = new LinkedList<>(); // int형 queue 선언

queue.offer(3);
queue.offer(5);
queue.offer(1);
queue.offer(4);

queue.poll();
System.out.println(queue); // 출력 결과 : [5, 1, 4]

queue.remove();
System.out.println(queue); // 출력 결과 : [1, 4]


- Queue의 값을 삭제 하기 위해서는 poll(), remove() 메서드를 사용한다 
- 앞서 말한 것 처럼 Queue는 FIFO(선입선출) 형태를 가지고 있으므로 가장 처음에 넣었던 값이 삭제된다

- 여기서도 remove()와 poll()은 데이터를 삭제하는 역할을 하는건 같지만 차이점이 있다

Queue 클래스 java docs remove(), poll()

 

- 위 사진 처럼 poll()은 queue의 데이터를 삭제를 하고 그 데이터를 반환한다 
- poll()은 값이 없으면 Null를 반환한다
- remove()도 삭제하고 그 데이터를 반환을 하지만 queue에 삭제할 데이터가 없으면 NosuchElementException를 던진다

 

 

제일 앞에 있는 값 조회 peek(), element()


Queue<Integer> q = new LinkedList<>(); // int형 queue 선언

q.offer(3);
q.offer(5);
q.offer(1);
q.offer(4);

System.out.println(q.peek()); // 출력 결과 : 3
System.out.println(q.element()); // 출력 결과 : 3


- Queue의 가장 앞에 있는 값이 조회하기 위해서는 peek(), element() 메서드를 사용한다
- 이 메서드들은 그저 조회만 한다

- 여기서도 peek() 와 element의 차이점이 있다

Queue 클래스 java docs element(), peek()

 

- 위 사진 처럼 peek()는 앞에 있는 값을 반환한다
- 만약 값이 없을때는 null를 반환한다
- 하지만 element()는 값이 없을때는 NoSuchElementException를 던진다