스택과 큐에 대해서 설명해 주세요.
데이터의 삽입과 삭제 순서를 제한하는 선형 자료구조로, 스택은 LIFO, 큐는 FIFO 방식으로 동작합니다.
스택 (Stack)
LIFO(Last In First Out) - 마지막에 넣은 것을 먼저 꺼냅니다.
push(1) → push(2) → push(3)
[3] ← top
[2]
[1]
---
pop() → 3 반환
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1); // 삽입 - O(1)
stack.push(2);
stack.push(3);
stack.pop(); // 삭제 - O(1), 반환값: 3
stack.peek(); // 조회 - O(1), 삭제 없이 top 확인
큐 (Queue)
FIFO(First In First Out) - 먼저 넣은 것을 먼저 꺼냅니다.
enqueue(1) → enqueue(2) → enqueue(3)
front → [1] [2] [3] ← rear
dequeue() → 1 반환
Queue<Integer> queue = new LinkedList<>();
queue.offer(1); // 삽입 - O(1)
queue.offer(2);
queue.offer(3);
queue.poll(); // 삭제 - O(1), 반환값: 1
queue.peek(); // 조회 - O(1), 삭제 없이 front 확인
시간복잡도
| 연산 | 스택 | 큐 |
|---|---|---|
| 삽입 | O(1) | O(1) |
| 삭제 | O(1) | O(1) |
| 조회 (top/front) | O(1) | O(1) |
| 중간 접근 | O(n) | O(n) |
스택 vs 큐
| 항목 | 스택 | 큐 |
|---|---|---|
| 방식 | LIFO | FIFO |
| 삽입/삭제 위치 | 한쪽 끝(top) | 양쪽 끝(rear/front) |
| 주요 활용 | 재귀, 뒤로가기, DFS | BFS, 작업 대기열 |
활용 예시
// 스택 활용 - 괄호 유효성 검사
Deque<Character> stack = new ArrayDeque<>();
for (char c : "({[]})".toCharArray()) {
if (c == '(' || c == '{' || c == '[') stack.push(c);
else stack.pop(); // 짝이 맞으면 pop
}
// 큐 활용 - BFS 탐색
Queue<Integer> queue = new LinkedList<>();
queue.offer(start);
while (!queue.isEmpty()) {
int node = queue.poll();
for (int next : graph.get(node)) queue.offer(next);
}
Java에서는
Stack클래스보다ArrayDeque사용을 공식 권장합니다.ArrayDeque는 스택과 큐 모두 구현 가능하며 성능도 더 우수합니다.