스택이란?
스택(stack) 은 나중에 넣은 것이 먼저 나오는 자료구조입니다. 이 규칙을
LIFO(Last In First Out)라고 부릅니다. 접시를 쌓아 올리고 위에서부터 꺼내는
모습을 떠올리면 정확합니다.
스택이 할 수 있는 일은 단 세 가지입니다.
- push — 맨 위에 하나 올린다.
- pop — 맨 위에서 하나 꺼낸다.
- top — 맨 위를 들여다본다(꺼내지는 않음).
세 연산 모두 \(O(1)\)입니다.
1. 왜 LIFO가 유용한가
스택은 가장 최근의 것을 먼저 처리해야 하는 상황에서 빛납니다. 대표적으로
괄호 짝 맞추기가 있습니다. 여는 괄호를 만나면 쌓아 두고, 닫는 괄호를 만나면
가장 최근에 쌓인 것과 짝지어 꺼냅니다.
( [ ] )
1) ( → 스택: (
2) [ → 스택: ( [
3) ] → [ 와 짝 → 스택: (
4) ) → ( 와 짝 → 스택: 비었음 → 올바른 괄호!
"가장 가까운 미해결 항목"을 늘 맨 위에서 즉시 찾을 수 있다는 것이 스택의 힘입니다.
2. 함수 호출도 스택이다
프로그램이 함수를 부를 때, 컴퓨터는 호출 스택(call stack) 에 복귀 위치를
쌓습니다. 재귀가 동작하는 것도 이 스택 덕분입니다. 그래서 재귀가 너무 깊으면
스택 오버플로가 납니다 — 스택의 동작을 이해하면 재귀도 자연히 이해됩니다.
3. 대표 활용
스택이 등장하는 전형적인 문제들입니다.
| 문제 유형 | 스택의 역할 |
|---|---|
| 괄호 검사 | 여는 괄호를 쌓고 닫을 때 짝 확인 |
| 수식 계산(후위 표기) | 피연산자를 쌓고 연산자에서 꺼내 계산 |
| 되돌리기(undo) | 마지막 동작을 맨 위에서 취소 |
| 다음 큰 원소 | 아직 답을 못 찾은 인덱스를 쌓아 둠 |
4. 모노톤 스택 맛보기
"각 원소의 오른쪽에서 자기보다 큰 첫 번째 원소"를 찾는 문제는 스택으로
\(O(N)\)에 풀립니다. 핵심은 스택을 단조(monotone) 상태로 유지하는 것입니다.
새 원소가 들어올 때, 스택 맨 위가 새 원소보다 작으면 "그 작은 원소의 답은 바로
이 새 원소다"라고 확정하며 꺼냅니다. 각 원소가 한 번씩 들어가고 한 번씩 나오므로
전체 \(O(N)\)입니다. (구현은 다음 강의에서.)
5. 복잡도와 메모리
스택은 보통 배열이나 연결 리스트로 구현하며, 모든 기본 연산이 \(O(1)\)입니다.
\(N\)개의 원소를 다루는 알고리즘이라면 메모리도 \(O(N)\)입니다. "최근 것부터
처리"라는 신호가 보이면 스택을 떠올리세요.
정리
스택은 LIFO 한 줄로 요약됩니다. 괄호, 수식, 되돌리기, 모노톤 스택 — 모두
"가장 최근의 미해결 항목을 즉시 꺼낸다"는 같은 아이디어의 변주입니다.