스택 (Stack) 자료구조 완벽 가이드
소프트웨어 엔지니어링 인터뷰에서 가장 기본적이면서도 중요한 자료구조 중 하나인 **스택(Stack)**에 대해 알아보겠습니다.
1. 스택(Stack)이란?
스택은 데이터를 차곡차곡 쌓아 올린 형태의 선형 자료구조입니다. 프링글스 통이나 식당의 접시 더미를 상상하면 이해하기 쉽습니다.
가장 중요한 특징은 후입선출 (LIFO: Last-In, First-Out) 원칙을 따른다는 것입니다. 즉, 가장 마지막에 들어간 데이터가 가장 먼저 나옵니다. 한쪽 끝(Top)에서만 데이터의 삽입과 삭제가 이루어집니다.
2. 스택의 주요 연산 및 시간 복잡도
스택은 매우 단순한 구조를 가지며, 주요 연산의 시간 복잡도는 대부분 입니다.
| 연산 | 설명 | 시간 복잡도 |
|---|---|---|
| Push | 스택의 가장 위(Top)에 데이터를 삽입합니다. | |
| Pop | 스택의 가장 위(Top)에 있는 데이터를 제거하고 반환합니다. | |
| Peek (Top) | 스택의 가장 위(Top)에 있는 데이터를 제거하지 않고 반환(확인)합니다. | |
| isEmpty | 스택이 비어있는지 확인합니다. |
만약 배열로 구현된 스택의 크기가 꽉 차서 동적으로 배열 크기를 늘려야 하는 경우, Push 연산은 최악의 경우 이 될 수 있지만 상각된 시간 복잡도(Amortized Time Complexity)는 여전히 로 간주합니다.
3. 스택의 구현
스택은 배열(Array/List)이나 연결 리스트(Linked List)를 사용하여 구현할 수 있습니다.
파이썬(Python)에서는 내장 자료형인 **리스트(List)**를 사용하여 아주 쉽게 스택을 사용할 수 있습니다. append() 메서드로 Push를, pop() 메서드로 Pop을 에 수행할 수 있습니다.
stack = []
# 데이터 삽입 (Push)
stack.append(1)
stack.append(2)
stack.append(3)
print(f"현재 스택: {stack}") # [1, 2, 3]
# 최상단 데이터 확인 (Peek)
top_element = stack[-1]
print(f"Top 데이터: {top_element}") # 3
# 데이터 추출 (Pop)
popped_element = stack.pop()
print(f"추출된 데이터: {popped_element}") # 3
print(f"Pop 이후 스택: {stack}") # [1, 2]4. 스택의 활용 사례
스택은 그 특성상 ‘가장 최근의 상태’를 기억하고 돌아가야 하는 상황에서 필수적으로 사용됩니다.
- 함수 호출 스택 (Call Stack): 프로그램에서 함수가 호출될 때마다 해당 함수의 정보(지역 변수, 복귀 주소 등)가 스택에 저장됩니다. 함수가 종료되면 스택에서
pop되어 이전 함수로 돌아갑니다. 재귀 함수가 무한 루프에 빠지면 ‘Stack Overflow’ 오류가 발생하는 이유입니다. - 웹 브라우저의 방문 기록 (뒤로 가기): 사용자가 방문한 페이지가 스택에 쌓이고, ‘뒤로 가기’ 버튼을 누르면 가장 최근(Top)에 방문한 페이지가
pop되어 이전 페이지로 이동합니다. - 실행 취소 (Undo / Ctrl+Z): 문서 편집기나 프로그램에서 사용자의 행동을 스택에 기록해 두고, 취소 시 가장 최근 행동부터 되돌립니다.
- 괄호 짝 맞추기 (문법 검사): 수식이나 코드에서
(,{,[등의 열린 괄호를 스택에 넣고, 닫힌 괄호가 나올 때마다 스택에서pop하여 짝이 맞는지 검사하는 알고리즘에 핵심적으로 사용됩니다. - 깊이 우선 탐색 (DFS, Depth-First Search): 그래프 탐색 알고리즘인 DFS를 재귀가 아닌 반복문으로 구현할 때 스택이 사용됩니다.
요약
스택(Stack)은 “나중에 들어온 것이 먼저 나가는(LIFO)” 단순하지만 강력한 자료구조입니다. 삽입과 삭제 연산이 한 곳(Top)에서만 발생하며 연산 속도가 로 매우 빠릅니다. 함수 호출, 뒤로 가기, 괄호 검사 등 이전 상태로 되돌아가거나 최근 데이터를 우선으로 처리해야 하는 문제에서 가장 먼저 떠올려야 하는 자료구조입니다.