[백준 28278] https://www.acmicpc.net/problem/28278
- C++ 같은 경우, Stack STL이 존재하기 때문에 Stack을 선언한 뒤, STL에 있는 명령어로 Stack에 원소를 push/pop 하면 된다.
- 반면에 C 같은 경우, STL이 존재하지 않기 때문에 일일히 명령어를 작성해야 한다.
스택
한 쪽 끝에서만 데이터를 넣었다 뺐다 할 수 있는 자료구조로, LIFO (Last In First Out) 형태의 선형 자료구조이다.
DFS (Depth First Search) [깊이 우선 탐색], 백트래킹에 활용됨 (후입선출이 재귀 알고리즘과 유사)
스택 STL
- 선언
#include <stack> stack<int> stack;
- 기본 함수
- push
-> 스택의 제일 위에 요소 추가stack.push(element);
- pop
-> 스택에서 제일 위에 있는 요소 제거stack.pop();
- top
-> 스택의 최 상단 요소 반환stack.top();
- size
-> 스택에 있는 요소의 개수를 확인할 때 사용stack.size();
- empty
-> 스택 내부가 비어있는지 확인할 때 사용stack.empty();
c
#include <stdio.h>
#include <stdlib.h>
typedef struct StackRecord *Stack;
struct StackRecord{
int Capacity;
int Top;
int* array;
};
Stack CreateStack(int maxElement){
Stack S=(Stack)malloc(sizeof(struct StackRecord));
if(S==NULL){
exit(1);
}
S->array=(int*)malloc(sizeof(int)*maxElement);
if(S->array==NULL){
exit(1);
}
S->Capacity=maxElement;
S->Top=-1;
return S;
}
int IsEmpty(Stack S){
return S->Top==-1;
}
int IsFull(Stack S){
return S->Top==S->Capacity-1;
}
void Push(int x, Stack S){
if(IsFull(S)){
return;
}
S->array[++S->Top]=x;
// ++가 앞에 있어야 다음 위치에 요소가 array로 들어가게 된다
}
void Pop(Stack S){
if(IsEmpty(S)){
printf("-1\n");
}else{
printf("%d\n",S->array[S->Top]);
S->Top--;
// 제일 위에 있는 요소를 출력한 뒤 제거해야 제거한 요소가 출력된다
}
}
int Top(Stack S){
if(IsEmpty(S)){
return -1;
}
return S->array[S->Top];
}
int main(){
int x,order;
scanf("%d",&x);
Stack stack=CreateStack(x);
for(int i=0;i<x;i++){
scanf("%d",&order);
switch(order){
case 1:
int element;
scanf("%d",&element);
Push(element,stack);
break;
case 2:
Pop(stack);
break;
case 3:
printf("%d\n",stack->Top+1);
// 아무것도 없을 때가 -1이기 때문에
break;
case 4:
if(IsEmpty(stack)){
printf("1\n");
}else{
printf("0\n");
}
break;
case 5:
if(!IsEmpty(stack)){
printf("%d\n",Top(stack));
}else{
printf("-1\n");
}
break;
}
}
free(stack->array);
free(stack);
return 0;
}
cpp
#include <iostream>
#include <stack>
using namespace std;
int main(void){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin>>N;
stack<int> S;
int order;
while(N--){
cin>>order;
switch(order){
case 1:
int num;
cin>>num;
S.push(num);
break;
case 2:
if(!S.empty()){
cout<<S.top()<<'\n';
S.pop();
// 빼낸 요소를 출력해야 하기 때문에 pop이 나중에 선언되어야 한다.
}else{
cout<<-1<<'\n';
}
break;
case 3:
cout<<S.size()<<'\n';
break;
case 4:
if(!S.empty()){
cout<<0<<'\n';
}else{
cout<<1<<'\n';
}
break;
case 5:
if(!S.empty()){
cout<<S.top()<<'\n';
}else{
cout<<-1<<'\n';
}
break;
}
}
return 0;
}
일례로 처음에 C로 동적할당을 할 때, (int*)
를 안쓰고 malloc을 했다가 (void*)
로 자동으로 선언이 되면서 컴파일에러가 떴었다