안녕하세요. 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 |
결과
'<개인공부> > [C++]' 카테고리의 다른 글
[C++] sort algorithm 정리 및 예시 (6) | 2017.10.17 |
---|---|
[C++] 레퍼런스, Reference, 참조자 (0) | 2017.09.23 |
[C++] priority_queue container 정리 및 사용법 (4) | 2017.08.04 |
[C++] queue container 정리 및 사용법 (2) | 2017.08.03 |
[C++] multimap container 정리 및 사용법 (2) | 2017.07.29 |
[C++] map container 정리 및 사용법 (10) | 2017.07.28 |
[C++] multiset container 정리 및 사용법 (0) | 2017.07.27 |
[C++] set container 정리 및 사용법 (8) | 2017.07.26 |