Algorithm 문제를 풀다보면 Stack, Queue를 자주 접할 수 있다.
오늘은 간단하게 개념을 확인하고 Java에서 사용하는 방법을 정리해보겠다.
LIFO(Last In First Out)
FIFO(First In First Out)
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.peek(); // 2를 return, stack = [1, 2]
stack.pop(); // 2를 return, stack = [1]
EmptyStackException
발생시킨다.EmptyStackException
발생시킨다.Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
queue.offer(2);
queue.peek(); // 1을 return, queue = [1, 2]
queue.poll(); // 1을 return, queue = [2]
Queue에서는 구현체로 LinkedList를 사용한다.
혹시 ArrayList와 LinkedList가 떠오르는가? ArrayList는 순차적으로 데이터를 추가/삭제하는 경우, LinkedList는 중간 데이터를 추가/삭제하는 경우 유리하다.
Queue는 그림처럼 front와 rear가 존재한다. 만약 ArrayList를 사용한다면 데이터를 삭제한다(poll)면 첫번째 데이터를 꺼내오고, 동시에 모든 데이터가 공간을 채우기 위해 이동하는 데이터 복사가 발생하여 매우 비효율적이다. 이런 이유로 Queue는 ArrayList보다 데이터의 추가 삭제가 쉬운 LinkedList를 사용한다.
IllegalStateException
을 발생시킨다.null
발생시킨다.null
반환한다.Reference