버미

백준 10828번 - 스택(c++) 본문

코딩 트레이닝

백준 10828번 - 스택(c++)

Bum_2 2023. 7. 9. 16:47

문제

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

명령은 총 다섯 가지이다.

  • 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

예제 입력 2

7
pop
top
push 123
top
pop
top
pop
예제 출력 2 
-1
-1
123
123
-1
-1

####문제 풀이

#include<stdio.h>
#include<string.h>

#define TRUE 1           
#define FALSE 0           
#define MINUS -1          
#define MAX_SIZE 10000    

typedef struct _stack{    
    int arr[MAX_SIZE];
    int top;
} Stack;


int IsEmpty(Stack * sp){  
    if(sp->top == -1) 
        return TRUE;
    return FALSE;
}

int Size(Stack *sp){   
    return sp->top + 1;
}


int IsFull(Stack * sp){       
    if(sp->top + 1 >= MAX_SIZE) 
        return TRUE;
    return FALSE;
}

void Push(Stack * sp, int data){  
    if(IsFull(sp)==TRUE) return;


    sp->arr[++(sp->top)] = data;    
}

int Pop(Stack * sp){    
    if(IsEmpty(sp) == TRUE)
        return MINUS;
    return sp->arr[(sp->top)--];
}

int Peek(Stack *sp){   
    if(IsEmpty(sp) == TRUE) 
        return MINUS;
    return sp->arr[sp->top];
}

int main(void){
    int i;
    char str[6];
    Stack stack;
    int n, num;

    scanf("%d", &n);
    fgetc(stdin);    //버퍼 비우기 
    stack.top = -1;    //stack 초기화. 

    for(i=0; i<n; i++)
    {
        scanf("%s", str);
        fgetc(stdin);    //버퍼 비우기. 

        if(!strcmp(str, "push"))
        {   
            scanf("%d", &num);
            fgetc(stdin);   
            Push(&stack, num);      
        }
        else if(!strcmp(str, "pop"))       
            printf("%d\n", Pop(&stack));
        else if(!strcmp(str, "empty"))
            printf("%d\n", IsEmpty(&stack));
        else if(!strcmp(str, "size"))
            printf("%d\n", Size(&stack));
         else if(!strcmp(str, "top"))       
            printf("%d\n", Peek(&stack));
    }

    return 0;    
}

스택의 주요 연산

  • push(): 스택에 원소 삽입
  • pop(): 스택에서 원소 제거 (후 그 값을 반환)
  • top()/peek(): 가장 위에 있는 원소 반환
  • isEmpty(): 스택이 비었는지 확인
  • isFull(): 스택이 가득 찼는지 확인