C++ std::stack 완전 정복: LIFO 컨테이너 어댑터 실전 가이드
std::stack이란?
std::stack은 LIFO(Last In, First Out) 원칙을 구현하는 컨테이너 어댑터입니다. 요소의 삽입과 제거가 한쪽 끝(top)에서만 허용됩니다. 기본적으로 std::deque를 내부 컨테이너로 사용하지만, 어떤 시퀀스 컨테이너(std::vector, std::list 등)도 공급 가능합니다.
컨테이너 어댑터는 이터레이터를 노출하지 않으므로 스택을 직접 순회할 수 없습니다. 대신 멤버 함수를 통해 상호작용합니다.
학습 목표
- std::stack 정의와 LIFO 동작 이해
- 스택 선언 문법 학습
- 멤버 타입과 핵심 연산 탐구
- push, pop, top, empty, size, emplace, swap 실습
- 표준 템플릿 라이브러리(STL)에서 스택 구현
문법
<stack> 헤더 포함하고 다음 템플릿으로 스택 선언:
template<class T, class Container = std::deque<T>> class stack;
- T – 요소 타입; 사용자 정의 클래스 포함 모든 유효한 C++ 타입 가능
- Container – 내부 컨테이너; 기본값
std::deque
멤버 타입
value_type – 요소 타입 T
container_type – 내부 컨테이너 타입
size_type – 컨테이너 크기용 부호 없는 정수 타입
핵심 연산
push() – 요소를 top에 추가
pop() – top 요소 제거
top() – 제거 없이 top 요소 접근
empty() – 스택이 비었는지 확인
size() – 요소 수 반환
emplace() – 요소를 직접 top에 구성하여 삽입
swap() – 다른 스택과 내용 교환
구현 개요
아래는 스택 연산의 시각적 표현입니다 (top of stack은 포인터로 표시).

push()와 pop()
push() 메서드는 새 요소를 추가하여 크기를 1 증가시킵니다:
stack.push(value);
반면 pop()은 top 요소를 제거하고 크기를 줄입니다:
stack.pop();
예제 1: 기본 스택 조작
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> st;
st.push(10);
st.push(20);
st.push(30);
st.push(40);
st.pop(); // 40 제거
st.pop(); // 30 제거
while (!st.empty()) {
cout << ' ' << st.top();
st.pop();
}
return 0;
}
출력: 20 10
empty(), size(), top()
이 유틸리티 함수들은 스택 상태에 대한 빠른 통찰을 제공합니다.
예제 2: 스택 상태 검사
#include <iostream>
#include <stack>
using namespace std;
void display(stack<int> s) {
while (!s.empty()) {
cout << '\t' << s.top();
s.pop();
}
cout << '\n';
}
int main() {
stack<int> st;
st.push(32);
st.push(21);
st.push(39);
st.push(89);
st.push(25);
cout << "The stack st is: ";
display(st);
cout << "\n st.size() : " << st.size();
cout << "\n st.top() : " << st.top();
st.pop();
cout << "\n st after pop: ";
display(st);
return 0;
}
출력: 스택 내용, 크기, top 요소, pop 후 상태 표시
emplace()와 swap()
• emplace()는 요소를 제자리에서 구성하여 추가 복사 회피.
• swap()은 두 스택의 내용을 효율적으로 교환.
예제 3: emplace()와 swap() 사용
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> st1, st2;
st1.emplace(12);
st1.emplace(19);
st2.emplace(20);
st2.emplace(23);
st1.swap(st2);
cout << "st1 = ";
while (!st1.empty()) {
cout << st1.top() << " ";
st1.pop();
}
cout << endl << "st2 = ";
while (!st2.empty()) {
cout << st2.top() << " ";
st2.pop();
}
}
출력: 스왑 전후 스택 내용 시연
STL에서 std::stack 사용
한 줄로 스택 구현:
std::stack<T> st;
예제:
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> st;
st.push(12);
st.push(19);
st.push(20);
cout << st.top(); // 20
cout << st.size(); // 3
return 0;
}
요약
- std::stack은 LIFO를 구현하며 top 요소만 접근 허용
- 컨테이너 어댑터; 기본 내부 컨테이너는
std::deque지만 커스터마이징 가능
- 핵심 함수:
push, pop, top, empty, size, emplace, swap
- 요소의 임시 저장이 필요한 시나리오에 가볍고 효율적인 도구