반응형

지난 시간에 STL의 시퀸스 컨테이너중 하나인 list에 대해 알아보았다.

연관 컨테이너로 넘어가기 전에 어댑터 컨테이너에 있는 몇몇 컨테이너들을 짚고 넘어가려고 한다.

이번 시간은 stack 컨테이너를 공부해볼 예정이다.


1. stack이란?

stack은 어댑터 컨테이너 중 하나로 vector, deque, list 구조와 같은 시퀸스 컨테이너를 변형한 것이다.

LIFO(Last In First Out) 방식이며 default로 deque 컨테이너를 기반으로 작동한다.

 

이를 사용하기 위해서 C언어에선 PUSH, POP과 같은 함수를 직접 만들어줘야하지만 C++에선 STL이 해결해준다.

<stack> 헤더파일을 include 해주어야하며,

std::stack<[데이터타입]> [변수이름]; 형식으로 선언해 사용할 수 있다.

(using namespace std;로 std 생략하여 편하게 작성가능)

 

*내부 컨테이너를 바꾸고 싶으면 std::stack<[데이터타입], [컨테이너타입]> [변수이름]; 형태로 선언하여 사용 가능하다.



2. stack - 생성자

stack 생성자는 다음과 같이 사용 가능하다. 아래부터 데이터타입이 int라고 가정하고 작성하겠다.

  • stack<int> stk;
    • 빈 stack 컨테이너 stk 생성(내부컨테이너 deque)
  • stack<int, vector<int>> stk;
    • 빈 stack 컨테이너 stk 생성(내부컨테이너 vector(int))


3. stack - 멤버 함수

다음은 stack 멤버 함수이다.

 

- 멤버 함수

  • stk.push(3);
    • stk에 3이란 데이터 삽입
  • stk.pop();
    • stk의 top이 가리키는 원소를 삭제
  • stk.top();
    • 맨위에 있는 데이터를 반환
  • stk.empty();
    • stk이 비어있는지 확인
  • stk.size();
    • stk의 사이즈 반환
  • stk.emplace(args);
    • C++11부터 지원
    • 특정 클래스의 stack이면 해당 인자를 해당 클래스 생성자로 넘겨 해당 클래스 객체 생성하여 Stack에 Push
  • stk.swap(stk2);
    • C++11부터 지원 
    • stk과 stk2의 데이터를 서로 바꿈


  •  

4. stack - 연산자

stack의 연산자이다.

  • ==, != 
    • == : 두 stack 컨테이너의 모든 원소가 같으면 참, 아니면 거짓
    • != : 두 stack 컨테이너에서 하나라도 원소가 다르면 참, 아니면 거짓
  • <, >, <=, >=
    • stack 컨테이너간 크기 비교


5. stack 구조 및 실습

위에서 설명한 stack의 구조는 다음 그림과 같다.



실습을 진행해보았다. stack 컨테이너를 이용해 원소를 추가, 삭제해보며 실습해보았다.

 

#include <iostream>
#include <stack>
using namespace std;

int main(void) {
	stack<int> stk;
	stk.push(10); cout << "stk 10 push" << endl;
	stk.push(20); cout << "stk 20 push" << endl;
	stk.push(30); cout << "stk 30 push" << endl;
	
	cout << "stk의 맨위 데이터 : " << stk.top() << endl;
	cout << "stk의 사이즈 : " << stk.size() << endl;
	cout << "stk이 비어있는가 : " << stk.empty() << endl;

	stk.pop(); cout << "stk pop > 30 out" << endl;
	stk.pop(); cout << "stk pop > 20 out" << endl;
	
	cout << "stk의 맨위 데이터 : " << stk.top() << endl;

	stk.pop(); cout << "stk pop > 10 out" << endl;

	cout << "stk의 사이즈 : " << stk.size() << endl;
	cout << "stk이 비어있는가 : " << stk.empty() << endl;
	return 0;
}

 

실행결과는 다음과 같다.

 


여기까지 stack 공부를 마친다. 슬슬 연관 컨테이너에 대해 공부해볼 계획이다.

반응형

'Programming > Language' 카테고리의 다른 글

[C++] STL - map 공부  (0) 2020.05.14
[C++] STL - set 공부  (0) 2020.05.14
[C++] STL - list 공부  (0) 2020.05.07
[C++] STL - vector 공부  (0) 2020.05.06
[C++] STL(Standard Template Library) 시작  (0) 2020.05.05

+ Recent posts