이 글에서는 C++ STL에서 자주 사용되는 stack::push()와 stack::pop() 함수의 동작 원리, 문법, 그리고 실전 예제까지 자세히 살펴보겠습니다.
C++ STL의 스택(Stack)이란?
스택은 LIFO(Last In First Out, 후입선출) 방식으로 데이터를 저장하는 자료구조입니다. 즉, 데이터의 삽입과 삭제가 항상 마지막에 삽입된 요소의 맨 위(top)에서만 일어납니다.
접시 더미를 떠올리면 이해하기 쉽습니다. 새 접시를 쌓을 때는 가장 위에 올리고, 접시를 꺼낼 때 역시 가장 위에 있는 것부터 꺼냅니다. 스택도 정확히 같은 방식으로 동작합니다.
stack::push()란?
stack::push()는 C++ STL의 내장 함수로, <stack> 헤더 파일에 정의되어 있습니다. 이 함수는 스택 컨테이너의 맨 위(top)에 새 요소를 삽입하는 데 사용되며, 전달된 값은 복사되어 초기화됩니다.
문법
stack_name.push(value_type& val);
매개변수
- val − 스택에 삽입하려는 값
반환값
이 함수는 아무 값도 반환하지 않습니다(void). 참고로 push() 연산의 시간 복잡도는 O(1)입니다.
입력 예시
std::stack<int> stack1; stack1.push(1); stack1.push(2); stack1.push(3);
출력 결과
3 2 1
위 코드에서는 1, 2, 3 순서로 값이 저장되지만, 스택은 top부터 꺼내므로 출력 시 3 2 1 순서로 표시됩니다.
예제
#include <iostream>
#include <stack>
using namespace std;
int main(){
stack<int> stck;
int Product = 1;
stck.push(1);
stck.push(2);
stck.push(3);
stck.push(4);
stck.push(5);
stck.push(6);
while (!stck.empty()){
Product = Product * stck.top();
cout << "\n스택의 크기: " << stck.size();
stck.pop();
}
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다 −
스택의 크기: 6 스택의 크기: 5 스택의 크기: 4 스택의 크기: 3 스택의 크기: 2 스택의 크기: 1
위 예제는 1부터 6까지의 값을 push()로 스택에 삽입한 뒤, while 루프 안에서 top()으로 최상단 값을 가져와 곱하고 pop()으로 하나씩 제거하면서 스택 크기의 변화를 출력합니다.
stack::pop()란?
stack::pop() 역시 C++ STL의 내장 함수로, <stack> 헤더 파일에 정의되어 있습니다. 이 함수는 스택 컨테이너의 맨 위(top)에 있는 요소를 제거하며, 제거 후 컨테이너의 크기가 1 감소합니다.
주의할 점은 pop()은 제거된 요소를 반환하지 않는다는 것입니다. 제거되는 값이 필요하다면 반드시 pop()을 호출하기 전에 top()으로 값을 먼저 확인해야 합니다.
문법
stack_name.pop();
매개변수
이 함수는 어떤 매개변수도 받지 않습니다.
반환값
이 함수는 아무 값도 반환하지 않습니다(void). pop() 연산의 시간 복잡도 역시 O(1)입니다.
입력 예시
std::stack<int> stack1; stack1.push(1); stack1.push(2); stack1.push(3); stack1.pop();
출력 결과
2 1
3개의 요소 중 가장 마지막에 삽입된 3이 pop()에 의해 제거되고, 스택에는 2와 1만 남습니다.
예제
#include <iostream>
#include <stack>
using namespace std;
int main(){
stack<int> stck;
stck.push(10);
stck.push(20);
stck.push(30);
cout << "초기 스택 크기: " << stck.size() << endl; // 3
stck.pop(); // 최상단 요소 30 제거
cout << "pop 후 최상단 요소: " << stck.top() << endl; // 20
cout << "pop 후 스택 크기: " << stck.size() << endl; // 2
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다 −
초기 스택 크기: 3 pop 후 최상단 요소: 20 pop 후 스택 크기: 2
마무리
push()와 pop()은 스택의 핵심 연산으로, 각각 데이터를 삽입하고 제거하는 역할을 하며 두 연산 모두 O(1)의 시간 복잡도를 가집니다. 이 두 함수를 잘 활용하면 괄호 검사, 실행 취소(Undo) 기능, 깊이 우선 탐색(DFS)처럼 LIFO 구조가 필요한 문제를 효율적으로 해결할 수 있습니다.