Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL 스택 push()와 pop() 함수 완벽 가이드

이 글에서는 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 구조가 필요한 문제를 효율적으로 해결할 수 있습니다.