[백준 10828] 스택 - C++

suyeon-jung·2022년 1월 9일
0

알고리즘스터디

목록 보기
1/10

문제

https://www.acmicpc.net/problem/10828

문제 설명

정수를 저장하는 스택을 구현하여 입력으로 주어지는 명령을 처리하는 프로그램을 작성

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

입출력

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

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

풀이

1. 배열로 구현

  • 배열로 구현한 스택에서 topdat[pos-1]로 조회할 수 있다.
  • 스택에 담긴 아이템의 개수는 pos로 조회할 수 있다.
#include <iostream>
using namespace std;

const int MX = 100005;
int dat[MX];
int pos = 0;

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

  int N;
  cin >> N;

  string s;
  int x;
  for (int i = 0; i < N; i++) {
    cin >> s;
    if (s == "push") {
      cin >> x;
      dat[pos++] = x;
    } else if (s == "pop") {
      if (!pos)
        cout << -1 << '\n';
      else {
        pos--;
        cout << dat[pos] << '\n';
      }
    } else if (s == "size") {
      cout << pos << '\n';
    } else if (s == "empty") {
      if (pos)
        cout << 0 << '\n';
      else
        cout << 1 << '\n';
    } else if (s == "top") {
      if (!pos)
        cout << -1 << '\n';
      else
        cout << dat[pos - 1] << '\n';
    }
  }
}

2. STL list로 구현

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

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

	list<int> mystack;
	int N;	// 명령의 수
	int num; // push 명령에서 입력으로 주어지는 수
	string command; // 입력으로 주어지는 명령


	cin >> N;

	for (int i = 0; i < N; i++) {
		cin >> command;

		if (command == "push") {
			cin >> num;
			mystack.push_back(num);
		}
		else if (command == "pop") {
			if (mystack.empty()) {
				cout << -1 << '\n';
			}
			else {
				cout << mystack.back() << '\n';
				mystack.pop_back();
			}
		}
		else if (command == "size") {
			cout << mystack.size() << '\n';
		}
		else if (command == "empty") {
			if (mystack.empty()) {
				cout << 1 << '\n';
			}
			else {
				cout << 0 << '\n';
			}
		}
		else if (command == "top") {
			if (mystack.empty()) {
				cout << -1 << '\n';
			}
			else {
				cout << mystack.back() << '\n';
			}
		}
	}

}

3. STL stack으로 구현

  • stackname.empty()는 스택이 비어있으면 True, 스택이 비어있지 않다면 False를 반환
    • empty 명령에 대한 출력은 stackname.empty()int형으로 형변환하여 출력한다.
#include <iostream>
#include <stack>
using namespace std;

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

  stack<int> S;
  int N;
  cin >> N;

  string s;
  while (N--) {
    cin >> s;
    if (s == "push") {
      int t;
      cin >> t;
      S.push(t);
    } else if (s == "pop") {
      if (S.empty())
        cout << -1 << '\n';
      else {
        cout << S.top() << '\n';
        S.pop();
      }
    } else if (s == "size")
      cout << S.size() << '\n';
    else if (s == "empty")
      cout << (int)S.empty() << '\n';
    else  // top
    {
      if (S.empty())
        cout << -1 << '\n';
      else
        cout << S.top() << '\n';
    }
  }
}

0개의 댓글