문제
Beginner Coder 의 #1102 번 문제를 STL Stack 으로 다시 구현해 보자.
Stack 자료구조는 STL 로 구현할 수 있고, 실제로 이것이 훨씬 편하다.
Stack 을 선언하는 방법은 아래와 같다.
#include <stack>
using namespace std;
stack <int> s;
위 코드에서,<int>
는 스택에 담을 자료형을 의미하고, s 은 그 스택의 이름이다. ( 스택 이름은 자유롭게 설정 가능 )
만약
stack <char> s2;
이렇게 선언한다면, s2 는 char
를 담는 스택이 되는 것이다.
스택을 선언한 후, 여기에 적용할 대표적인 메소드(함수)는 아래와 같다.
함수 1 : empty()
사용 예시 : if ( s.empty() == true )...
empty() 함수는 true 또는 false 를 return 하는 bool 함수다.
스택이 비어있으면 true 를,
스택이 안 비어있으면 false 를 return 한다.
함수 2 : push()
사용 예시 : s.push(7);
이는 s 라는 스택 맨 위에 7 을 삽입한다는 의미다. 즉, 7 이 s 의 맨 꼭대기 (top) 원소가 된다.
int k = 7;
s.push(k);
위처럼 해도 s 에 7 이 맨 위에 삽입된다.
함수 3 : pop()
사용 예시 : s.pop();
이는 스택에서 "맨 꼭대기" 에 있는 원소를 제거하도록 동작한다.
제거만 할 뿐이지, 맨 꼭대기 원소의 값을 알려주지는 않는다.
단, 스택이 비어있는 상태에서 pop() 을 호출하면 런타임 에러가 발생한다.
비어있는 스택에서 원소를 제거할 수는 없기 때문이다.
따라서 항상 pop() 을 하기 전에 empty() 함수를 먼저 호출해줘서 비어있는지 확인하는 습관을 들이자.
함수 4 : top()
사용 예시 : if (s.top() == 7)... 또는 int t = s.top();
top() 함수는 스택에서 맨 꼭대기에 있는 원소의 값을 return 한다.
맨 꼭대기의 값을 알려줄 뿐이고, 그 원소를 제거하지는 않는다.
top() 도 pop() 과 마찬가지로, 스택이 비어있는 상태에서 호출하면 런타임 에러가 발생한다.
따라서 항상 top() 을 실행하기 전에 empty() 함수를 먼저 호출해줘서 비어있는지 확인하는 습관을 들이자.
함수 5 : size()
사용 예시 : if (s.size() == 0)... 또는 int sz = s.size();
size() 함수는 스택의 원소의 개수를 return 한다.
만약 스택이 비어있다면 size() 함수는 0 을 return 할 것이다.
이제 위 5가지 함수를 이용하여, #1102 문제를 다시 구현해보자.
<처리조건>
주어진 명령은 다음의 3가지이다.
1. "i a"는 a 라는 정수를 스택에 넣는다. 이때, a는 10,000 이하의 자연수이다.
2. "o"는 스택에서 데이터를 빼고, 그 데이터를 출력한다. 만약 스택이 비어있으면, "empty"를 출력한다.
3. "c"는 스택에 쌓여있는 데이터의 수를 출력한다.
입력
첫 줄에 N이 주어진다. N은 주어지는 명령의 수이다. (1≤N≤100)
둘째 줄부터 N+1줄까지 N개의 명령이 주어지는데, 한 줄에 하나씩 주어진다.
출력
각 명령에 대한 출력 값을 한 줄에 하나씩 출력한다.
출력 내용이 하나도 없는 경우는 주어지지 않는다.
예제1
7
i 7
i 5
c
o
o
o
c
2
5
7
empty
0