작년에 Stack을 배워서 쉽게 풀 수 있을 줄 알았는데
생각보다 처음부터 감이 잡히지는 않았다..
그래서 작년에 공부할 때 저장해둔 노션을 참고해서 풀었다.
비슷한 문제 여러번 풀다보면 감이 잡히지 않을까 !

push, pop, size, empty, top이 기본적인 stack의 기능 !
stack은 LIFO로, 마지막에 들어오는 것이 먼저 나가는 방식이다.
클래스 선언을 통해 Stack 클래스를 선언한다.
#include <iostream>
using namespace std;
class Stack { // 스택 클래스 만들기
public: // public 선언으로 클래스 밖에서도 접근이 가능하게 만든다.
int stack[10000]; // 문제에서 제시된 범위를 참고하여 정수형 배열 선언
int size;
Stack(){size=0;} // 초기화하는 함수이다. constructor, 생성자라고 한다. size를 0으로 설정한다.
void push(int data){
stack[size]=data;
size+=1;
}
bool empty() {
if(size==0){ // size가 0이면 empty가 진실이다.
return true;
}
else{
return false;
}
}
int pop(){ // 배열의 가장 마지막에 있는 것을 지우는 함수.
if(empty()){ // 비어있으면 지울 것이 없기때문에 -1을 반환한다.
return -1;
}
else{
stack[size-1]=0;
size=size-1;
return stack[size];
}
}
int top(){ // 배열의 가장 마지막에 있는 것을 반환한다.
if(empty())
{
return -1;
}
else{
return stack[size-1];
}
}
};
int main(void){
int N;
cin>> N;
Stack s;
for (int i=0;i<N;i++){
string cmd; // string으로 받아온다.
cin>>cmd; // cin string은 공백을 기준으로 하기때문에 제시된 문제와 부합한다.
if(cmd=="push"){ // string이 무엇이냐에 따라 명령어를 시행한다.
int data;
cin>>data;
s.push(data);
}
else if(cmd=="pop"){
cout<<(s.empty()?-1:s.top())<<endl;
if(!s.empty()){
s.pop();
}
}
else if(cmd=="size"){
cout<<s.size<<endl;
}
else if(cmd=="empty"){
cout<<s.empty()<<endl;
}
else if(cmd=="top"){
cout<<s.top()<<endl;
}
}
return 0;
}