[백준/C++] 10828번 스택

dev.hyeon·2023년 1월 12일
0

알고리즘

목록 보기
43/44
post-thumbnail

10828번 스택

문제

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 다섯 가지이다.

  • push X: 정수 X를 스택에 넣는 연산이다.
  • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 스택에 들어있는 정수의 개수를 출력한다.
  • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
  • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

풀이

Stack은 LIFO(Last In, First Out) 구조이다. 즉, 가장 나중에 삽입된 데이터가 가장 먼저 삭제된다.
C++ STL에서 제공하는 Stack의 기본함수에는 push, pop, top, empty, size, swap 등이 있다. 이때 pop, top 함수는 stack이 비어있는지 확인한 후 실행해야 한다.

1. 스택에 데이터 삽입

stack.push(element);

2. 스택의 최상단 데이터 삭제

stack.pop();

3. 스택의 최상단 데이터 반환

stack.top()

4. 스택이 비어있는 지 확인

stack.empty();

5. 스택의 크기 반환

stack.size();

6. 두 스택의 내용 바꾸기

stack1.swap(stack2);

C++ STL Stack을 사용해 문제를 풀었다. 문자열을 읽어 문제에서 제시한 명령을 그대로 구현하였다. 명령어가 push인 경우 어떤 값을 추가할 것인지 정수를 읽는 연산을 추가로 한다.


코드

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

int main(){
  ios::sync_with_stdio(0);
  cin.tie(0);

  stack<int> st;
  int n;
  cin >> n;
  
  while (n--){
    string c;
    cin >> c;
    int result;

    if (c == "push"){
      int k;
      cin >> k;
      st.push(k);
      continue;
    }
    else if (c == "pop"){
      if (st.empty()) result = -1;
      else{
        result = st.top();
        st.pop();
      }
    }
    else if (c == "size") result = st.size();
    else if (c == "empty") result = st.empty() ? 1 : 0;
    else if (c == "top") result = st.empty() ? -1 : st.top();
    cout << result << '\n';
  }
  return 0;
}

0개의 댓글