ALG/ALG & DS

C/C++) 자료구조 - Stack, 스택

jh2ee 2023. 1. 19. 23:26

알고리즘 공부를 시작했다.

이를 위해서는 자료구조에 대한 지식이 바탕이 되어 있어야 하기에 여러가지 자료구조에 대해 정리하려 한다.

 

첫번째로 정리할 자료구조는 Stack, 스택이다.

 

목차

  • 스택의 정의
  • 스택의 구현
  • STL스택

 

 

 

1. 스택의 정의

 스택은 톱(top)이라고 하는 한쪽 끝에서 모든 삽입(push)과 삭제(pop)이 일어나는 순서리스트이다.

스택을 그림으로 표현하면 아래와 같다. 

그림을 보면 원소들이 탑처럼 쌓여있는 것을 볼 수 있다. 

앞서 말했듯 top에서 push와 pop이 이루어지기 때문에

후입선출, LIFO(Last-In-First-Out) 구조를 띈다.

 

 

 

 

 

 

 

 

 

 

2.  스택의 구현

 이제 스택을 구현해보자. 스택에 자주 쓰이는 메소드는 크게 5가지가 있다.

 

push()

스택에 원소를 삽입한다. 원소는 스택의 top에 위치한다

 

pop()

스택의 맨 위에 있는 top 원소를 삭제한다. 스택이 빈 경우 런타임 에러를 발생시킨다.

 

top()

스택의 맨 위에 있는 top 원소의 값을 반환한다. pop과 마찬가지로 스택이 빈 경우 런타임 에러를 발생시킨다.

 

empty()

스택이 비었다면 1, 아니라면 0을 반환한다.

 

size()

스택의 크기, 스택 내의 원소의 수를 반환한다.

 

class Stack{
    private:
    int arr[100005]={}; //배열을 이용해 구현
    int pos=0; //스택의 top을 따라간다
    
    public:
    void push(int a){arr[pos++]=a;}
    void pop(){
        if(pos==0) cout<<"-1\n";
        else{ cout<<arr[--pos]<<"\n"; }
    }
    void top(){
        if(pos==0) cout<<"-1\n";
        else{ cout<<arr[pos-1]<<"\n"; }
    }
    void empty(){
        if(pos==0) cout<<"1\n";
        else cout<<"0\n";
    }
    void size(){cout<<pos<<"\n";}
};

배열을 이용해 stack class를 구현했다.

pos는 스택의 top을 표시하는 역할을 한다.

pop과 top은 위에서 언급했듯 빈 스택에서 수행될 경우 런타임 에러가 발생할 수 있으므로 예외처리를 해주었다.

 

 

3. STL스택

STL스택도 앞서 구현한 스택과 사용법이 크게 다르지 않다.

먼저 STL스택을 사용하기 위해 헤더파일을 포함시켜주자

#include<stack>

헤더를 불러왔으니 이제 스택을 사용할 수 있다.

스택의 선언은 아래와 같다.

stack<int> s;

stack<자료형> 이름; 의 방식으로 선언하면 된다.

스택의 메소드들은 아래와 같은 방식으로 사용할 수 있다.

s.push(3); //3이 top
s.push(1); //1이 top
s.pop(); //1 pop
s.top(); //3
s.empty(); //비지 않았으므로 0
s.size(); //1