<개인공부>/[C++]

[C++] stack container 정리 및 사용법

BlockDMask 2017. 8. 2. 16:11
반응형
  • 안녕하세요. BlockDMask 입니다.

  • 오늘은 Container Adapter (stack, queue, priority_queue) 중에 stack container 에 대해 알아보겠습니다.

  • 다들 stack의 동작 원리나 구조는 아신다고 생각하고 포스팅 하곘습니다.

0. stack container

  • LIFO(Last in First out) 방식.

  • stack container adapter는 vector, deque, list container에 붙어서(기반으로) 사용이 가능합니다.

  • 내부적으로는 vector, deque, list container의 구조로 구현이 되어있되,
    stack이라는 포장지로 잘 감싸서 stack과 같이 작동하도록 멤버 함수 등을 지원해 주는 것 입니다.


  • default는 deque container 기반으로 작동합니다.

1. stack container 사용법

  • <stack> 헤더파일 필요합니다.

  • using namespace std; 사용하면 편리합니다.

2. stack container 생성자와 연산자 

  • template <typename T, typename Container = deque<T> > 
    class stack;


  • 기본 생성자 형식은 stack< [Data Type] > [변수 이름]; 입니다.
    ex) stack<int> st;
    ex) stack<string> st;

  • 내부 컨테이너 구조를 바꾸는 형식은 stack <[Data Type] , [Container Type]> [변수 이름]; 입니다.
    ex) stack<int, list<int> > st;
    ex) stack<stack, vector<string> > st;

  • 연산자 ( "==", "!=", "<", ">", "<=", ">=" ) 사용가능합니다.

3. stack container 멤버 함수

-> stack<int> st;

  • bool empty() const;
    - 비어있는지 확인.
    ex) st.empty();

  • size_type size() const;
    - 사이즈 반환
    ex) st.size();

  • value_type& top();

  • const value_type& top() const;
    - 맨위에 있는 인자 반환
    ex) st.top();

  • void push(const value_type& val);
    - 데이터(value) 삽입
    ex) st.push(999);


  • void pop();
    - top 이 가리키는 원소를 삭제합니다.
    ex) st.pop();

  • C++11 (emplace, swap) 지원합니다.


4. stack container 예제


T1) 간단한 입출력.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
#include<stack>
using namespace std;
 
int main(void){
    stack<int> st;
    
    st.push(10);
    st.push(20);
    st.push(30);
    st.push(40);
    st.push(50);
    
    cout << "st.size() : " << st.size() << endl;
    cout << "st.top() -> st.pop()" << endl;
    while(!st.empty()){
        cout << st.top() << endl;
        st.pop();
    }    
    return 0;    
}
cs


  • 결과.


T2) 정말 간단한 괄호 검사 (스택 괄호 검사 예제)

  • 간단한 예시이므로 괄호의 우선순위 고려하지 않았습니다.

  • try catch 사용하지 않고 예외처리 함수를 만들었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<iostream>
#include<stack>
using namespace std;
 
void Error(){
    cout << "=> Wrong!!" << endl;
}
 
int main(void){
    stack<char> st;
    
    //편의상 6개만 받겠습니다.
    //간단한 예시이므로 괄호 우선순위 고려 안하겠습니다.
     
    char c;
 
    for(int i=0; i<6; i++){
        cin >> c;
        
        if(c == ')' || c == '}' || c == ']'){ //닫는 괄호 일 경우 
 
            if(st.empty()){    //아무것도 없는데 닫는 괄호가 먼저 오는 경우 
                 Error();
                 return -1;
            }
            
            if((c == ')' && st.top() == '(')    //짝이 맞는지 
                || (c == '}' && st.top() == '{')
                || (c == ']' && st.top() == '[')){
 
                st.pop();    //맞으면 pop 
                continue;                
            }
                        
        }
        
        st.push(c);            
    }
    
    if(!st.empty()){    //다끝났는데 남아있는 경우. 
        Error();
        return -1;
    }
    
    cout << "=> Correct!!" << endl;
    return 0;    
}
cs
  • 결과





참고 : http://www.cplusplus.com/reference/stack/stack/

반응형