본문 바로가기

코딩 및 기타/어서와! 자료구조와 알고리즘

9일차

728x90

스택

∙ 스택이란?

- stack : 물건을 쌓아 올린 더미 또는 쌓는 행위

- 자료 구조에서 스택은 데이터를 쌓아 올리듯이 저장하는 선형 자료 구조로서, 후입선출 원리에 따라 삽입과 삭제가 수행됨

- 후입선출 (LIFO, Last-in First-out)  : 나중에 들어온 데이터가 먼저 출력됨 

- 데이터의 입출력이 한쪽 방향에서만 수행되는 리스트

ex) 텍스트 편집기의 실행 취소 가능, 웹 브라우저에서 뒤로 가기, 함수 호출 시 복귀 주소 기억

 

∙ 스택의 주요 연산

- push(e) : 스택의 맨 위에 원소 e를 추가

- pop() : 스택의 맨 위에 있는 원소를 삭제

- top() : 스택의 맨 위에 있는 원소를 참조. peek()

- empty() : 스택이 비어 있으면 true를 반환

- size() : 스택의 원소 개수를 반환

 

∙ 배열을 이용한 스택의 구현

- 미리 정해진 크기의 배열을 할당하고, 가장 최근에 입력된 자료 위치를 가리키는 t 변수를 사용

> pus(e) : t 값을 1 증가시키고, 해당 위치에 e를 대입

> pop() : t 값을 1 감소

> top() : arr[t] 값을 반환 

- 장점 : 구현이 간단하고, 삽입이나 삭제가 빠르게 동작

- 단점 : 미리 정해진 크기보다 많은 데이터를 삽입할 경우, 스택 오버플로우(stack overflow) 에러가 발생

 

 

∙ 연결 리스트를 이용하여 스택의 구현

- 단순 연결 리스트를 이용하여, 새로 추가한 데이터를 연결 리스트 맨 앞에 삽입하는 방식

> push(e) : push_first(e)

> pop() : pop_first()

> top() : head -> next 값을 반환

- 장점 : 크기가 제한되지 않음

- 단점 : 구현이 복잡하고, 삽입이나 삭제 시간이 오래 걸림

 

∙ 스택 구현 코드

#include <iostream>
#include <vector>

// vector을 이용하여 구현한 스택 자료구조
template <typename T>
class Stack
{
public:
    Stack() {}
    
    void push(const T& e) { v.push_back(e); }
    void pop() { v.pop_back(); }
    const T& top() const { return v.back(); }
    
    bool empty() const { return v.empty(); }
    int size() const { return v.size(); }
    
private:
    std::vector<T> v;
};

using namespace std;

int main()
{
    // 스택 생성
    Stack<int> stk;

    // 스택에 데이터 넣기
    stk.push(10); // 10
    stk.push(20); //20, 10
    stk.push(30); // 30, 20, 10
    
    // 맨 위에 있는 데이터 꺼내기
    stk.pop(); // 20, 30
    
    // 맨 위에 있는 데이터 참조하여 보여주기
    cout << stk.top() << endl;  // 20
    
    stk.push(40);
    
    // 스택에 저장된 데이터 확인
    while (!stk.empty()){
        auto& e = stk.top(); // 데이터를 참조형 변수로 받아오는 코드
        cout << e << ", ";
        stk.pop();
    }
    cout << endl;
    
}

 

 

∙ std::stack

- LIFO(Last-In First-Out) 방식의 스택 자료 구조를 구현한 컨테이너 어댑터

- 템플릿 매개변수 T는 스택에 저장할 타입을 지정하고, Container에는 내부에서 사용할 컨테이너를 지정

- Container에는 deque, vector, list를 지정할 수 있음

- <stack>에 정의되어 있음

 

∙ stack 예제코드

#include <iostream>
#include <stack>

using namespace std;

int main()
{
    stack<int> stk;
    
    // 스택에 데이터 넣기
    stk.push(10); // 10
    stk.push(20); //20, 10
    stk.push(30); // 30, 20, 10
    
    // 맨 위에 있는 데이터 꺼내기
    stk.pop(); // 20, 30
    
    // 맨 위에 있는 데이터 참조하여 보여주기
    cout << stk.top() << endl;  // 20
    
    stk.push(40);
    
    // 스택에 저장된 데이터 확인
    while (!stk.empty()){
        auto& e = stk.top(); // 데이터를 참조형 변수로 받아오는 코드
        cout << e << ", ";
        stk.pop();
    }
    cout << endl;
}

'코딩 및 기타 > 어서와! 자료구조와 알고리즘' 카테고리의 다른 글

11일차  (0) 2023.08.17
10일차  (0) 2023.08.16
8일차  (0) 2023.08.13
캐스팅 (형변환)  (0) 2023.08.13
7일차  (0) 2023.08.12