기록은 기억을 이기고 시간보다 오래 남는다.

프로그래밍 언어/c++

[C/C++] Stack in c++ (기본 사용법, 예제)

준_준 2024. 5. 29. 14:41

안녕하세요 준준 입니다.

 

오늘은 C++ STL 중 하나인

Stack(스택)에 대해 알아보도록 하겠습니다.


What is Stack?

스택의 사전적 의미로는 '쌓다', '더미'입니다. 

상자에 물건을 쌓아 올리듯 데이터를 쌓는 자료 구조라고 할 수 있습니다. 

스택은 대표적인 LIFO (Last In First Out) 구조입니다.

따라서 제일 마지막에 넣은 데이터가 가장 먼저 빠져나가는 것을 알 수 있습니다.

쉬운 예시로 쌓여 있는 그릇을 생각하시면 쉽습니다. 

상식적으로 그릇은 쌓을 때 맨 위에서부터 쌓고 꺼낼 때는 맨 위에부터 꺼내곤 합니다.

따라서 가장 최근에 넣은 그릇을 가장 빨리 쓰게 됩니다.

이해가 조금 되셨을 까요?


Stack의 특징

1. 먼저 들어간 자료가 나중에 나오는 구조

2. 시스템 해킹에서 버퍼오버플로우 취약점을 이용한 공격을 할 때 스택 메모리의 영역에서 수행

3. 인터럽트처리, 수식의 계산, 서브루틴의 복귀 번지 저장 등에 사용

4. 그래프의 깊이 우선 탐색(DFS)에서 사용

5. 재귀적 함수를 호출할 때 사용


사용 방법

-헤더 파일

스택을 사용하기 위해서는 #include <stack> 먼저 선언해주어야 합니다.

#include <stack>

-스택 선언

스택을 선언하는 방법은

stack<자료형> 이름 / 이렇게 선언 하시면 됩니다.

stack<int> s;

-스택 함수

스택을 잘 활용하기 위해서는 어떤 함수들이 있을까요?

 

 

▷ 스택에 데이터 추가하기

push 예시

스택이름. push(데이터)  형태로 데이터를 추가합니다. 

stack.push(element)

 

▷ 스택에 데이터 삭제하기 

pop 예시 사진

스택이름. pop(데이터) 형태로 스택의 top 데이터를 삭제합니다.

stack.pop()

 

▷ 스택의 제일 위(탑, top) 데이터 반환

스택이름. top() 형태로 제일 최상위 데이터를 반환합니다. 

stack.top()

 

▷ 스택의 사이즈 반환

스택이름. size() 형태로 스택의 현재 사이즈를 반환합니다. 

stack.size()

 

▷ 스택이 비어있는지 확인 

스택이름. empty() 형태로 스택이 비어있는지 확인합니다.

stack.empty()

 

▷ 스택 SWAP  : 두 스택의 내용 바꾸기

스택 1과 스택 2 두 스택의 내용을 바꾸고 싶은 경우, 내장된 swap 함수를 사용합니다. 

swap(스택 1 이름, 스택 2 이름) 형태로 두 스택의 내용을 바꿉니다.

swap(stack1 , stack2)

 

 


아래는 예제 코딩 테스트 입니다. 

#include <string>
#include <vector>
#include <stack>
#include <sstream>

using namespace std;

int solution(string s) {
    int answer = 0;
    stringstream ss(s);
    string temp;
    stack<string> tack;
    while (ss >> temp) {
        if (temp == "Z") {
            if (!tack.empty()) {
                tack.pop();
            }
        } else {
            tack.push(temp);
        }
    }
    while (!tack.empty()) {
        answer += stoi(tack.top());
        tack.pop();
    }
    return answer;
}
반응형