Programming/백준 (c++)

[백준] #10828: 스택

마이구미포포 2022. 9. 11. 14:55

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 

14
push 1
push 2
top
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
top

예제 출력 1 

2
2
0
2
1
-1
0
1
-1
0
3

이 문제는 스택을 구현하는 문제로, 라이브러리를 사용한 버전과 사용하지 않은 버전 두가지로 모두 문제를 풀어보았다

라이브러리 사용

#include <iostream>
#include <vector>
#include <stack>

using namespace std;
const int SIZE = 1e4; //스택 사이즈 (10^4)

vector<int> stack_vec(SIZE);
int top_pointer=-1; //스택의 현재 위치 가리키는 포인터
 
int main()
{
    int n,x;
    string cmd; //명령
    
    stack<int> st;
    
    //입력
    cin>>n; 
    while(n--){
        cin>>cmd;
        if(cmd=="push"){
            cin>>x;
            //런타임 에러 방지하기 위해, 스택이 꽉 찼는지 검사
           // if(!full()){ //라이브러리 사용시엔 필요 x
                st.push(x);
            //}
            continue;
        }
        if(cmd=="pop"){
            if(st.empty()){
                cout<<"-1\n";
            }
            else{
                cout<<st.top()<<"\n";
                st.pop();
            }
            continue;
        }
        if(cmd=="size"){
            cout<<st.size()<<"\n";
            continue;
        }
        if(cmd=="empty"){
            cout<<st.empty()<<"\n";
            continue;
        }
        if(cmd=="top"){
            if(st.empty()){
                cout<<"-1\n";
            }
            else{
                cout<<st.top()<<"\n";
            }
        }
    }
}

라이브러리를 이용하려면 <stack> 헤더파일을 서주고 <vector>를 선언하듯이 스택 선언을 해주면 된다

 

라이브러리 사용 x (함수 직접 구현)

#include <iostream>
#include <vector>

using namespace std;
const int SIZE = 1e4; //스택 사이즈 (10^4)

vector<int> stack_vec(SIZE);
int top_pointer=-1; //스택의 현재 위치 가리키는 포인터

//스택이 비어있는지 안비어있는지 확인
bool full(){
    return top_pointer==(SIZE-1);
}

//push : 삽입
void push(int x){
    stack_vec[++top_pointer]=x;
}

//pop : 가장 위의 값 삭제
void pop(){
    top_pointer--;
}

//size : 스택 사이즈 반환
int size(){
    return top_pointer+1;
}

//empty : 비어있으면 1, 아니면 0
bool empty(){
    return top_pointer==-1;
}

//top : 가장 위에 있는 원소 반환 (삭제x)
int top(){
    return stack_vec[top_pointer];
} 
 
int main()
{
    int n,x;
    string cmd; //명령
    
    //입력
    cin>>n; 
    while(n--){
        cin>>cmd;
        
        if(cmd=="push"){
            cin>>x;
            //런타임 에러 방지하기 위해, 스택이 꽉 찼는지 검사
            if(!full()){
                push(x);
            }
        }
        
        if(cmd=="pop"){
            if(empty()){
                cout<<"-1\n";
            }
            else{
                cout<<top()<<"\n";
                pop();
            }
            continue;
        }
        
        if(cmd=="size"){
            cout<<size()<<"\n";
            continue;
        }
        
        if(cmd=="empty"){
            cout<<empty()<<"\n";
            continue;
        }
        
        if(cmd=="top"){
            if(empty()){
                cout<<"-1\n";
            }
            else{
                cout<<top()<<"\n";
            }
        }
    }
}


라이브러리를 사용하면 위에 직접 구현한 함수들을 굳이 구현하지 않고 바로 사용할 수 있다

문제를 풀다보면 스택을 사용할 일이 정말 많기 때문에 사용하기 편리하게 라이브러리를 이용하자