ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 10828] 스택
    C 프로그래밍/BOJ 2022. 8. 15. 11:46
    728x90

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

     

    10828번: 스택

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

    www.acmicpc.net

    #include <stdio.h>
    #include <string.h>
    int N;
    struct _st
    {
    	char order[10];
    }O[10000];
    
    int push[10000];
    int stack[10000];
    int sptr;
    
    void input(void)
    {
    	scanf("%d", &N);
    	sptr = N;
    	for (int i = 0; i < N; i++) {
    		scanf("%s", O[i].order);
    		if (strcmp(O[i].order,"push") == 0) scanf("%d", &push[i]);
    	}
    }
    
    void stack_push(int i)
    {
    	if (sptr == 0) return;
    	sptr--;
    	stack[sptr] = push[i];
    }
    
    void stack_pop(void)
    {
    	if (sptr == N) {
    		printf("%d\n", -1);
    		return;
    	}
    	printf("%d\n", stack[sptr]);
    	stack[sptr] = 0;	//size 측정 때문
    	sptr++;
    	return;
    }
    
    void stack_size(void)
    {
    	int cnt = 0;
    	for (int i = N - 1; i >= 0; i--) {
    		if (stack[i] == 0) break;
    		cnt++;
    	}
    	printf("%d\n", cnt);
    	return;
    }
    
    void stack_empty(void)
    {
    	if (sptr == N) {
    		printf("%d\n", 1);
    		return;
    	}
    	printf("%d\n", 0);
    	return;
    }
    
    void stack_top(void)
    {
    	if (sptr == N) {
    		printf("%d\n", -1);
    		return;
    	}
    	printf("%d\n", stack[sptr]);
    }
    
    
    void stack_func(void)
    {
    	for (int i = 0; i < N; i++) {
    		if (strcmp(O[i].order, "push") == 0) stack_push(i);
    		else if (strcmp(O[i].order, "pop") == 0) stack_pop();
    		else if (strcmp(O[i].order, "size") == 0) stack_size();
    		else if (strcmp(O[i].order, "empty") == 0) stack_empty();
    		else if (strcmp(O[i].order, "top") == 0) stack_top();
    	}
    }
    
    int main(void)
    {
    	input();
    	stack_func();
    	return 0;
    }

    FD 스택(full일 때 sptr == 0, empty일 때 sptr == N)으로 구현해 주었다. 

     

    1. push 동작에서 만약 sptr == 0이면 (스택이 꽉 찼다면) 더 이상 원소를 넣을 수 없으므로 그냥 리턴해준다. 

    그렇지 않으면 sptr를 한 칸 내리고, 바로 해당 자리에 원소를 삽입한다. 

    2. pop 동작에서 만약 sptr == N이면 (스택이 비어있다면) 꺼낼 원소가 없으므로 -1을 출력하고 리턴해준다. 

    그렇지 않으면 sptr가 가리키는 자리의 원소를 인쇄하고, 해당 자리에 0을 대입해준다. 이론상 0을 대입해주는 동작은 필요하지 않지만, 나중에 size를 계산하기 위해 일부러 추가해주었다. 그리고 sptr를 한 칸 올려준다.

    3. size 측정 함수에서는 for 루프를 돌면서 i == N -1 (첫 원소)부터 stack[i] == 0이 될 때 까지 돌면서 cnt를 세어 준다. 

    4. empty 함수에서는 만약 sptr == N이면 스택이 비어있는 것이므로 1을 출력하고, 그렇지 않으면 0을 출력한다. 

    5. top 함수에서는 만약 sptr == N이면 스택이 비어있는 것이므로 -1을 출력하고, 그렇지 않으면 현재 sptr가 가리키고 있는 값이 스택에서 가장 위에 있는 값이므로 그것을 출력한다. 

     

    스택을 공부하기 좋은 문제였다. 

    더불어 문자열 비교는 strcmp 라이브러리(결과가 0일때 두 문자열이 같음) 사용했다. 

    728x90

    'C 프로그래밍 > BOJ' 카테고리의 다른 글

    [백준 2567] 색종이-2  (0) 2022.08.18
    [백준 2564] 경비원  (0) 2022.08.17
    [백준 13458] 시험감독  (0) 2022.08.13
    [백준 2869] 달팽이는 올라가고 싶다  (0) 2022.08.01
    [백준 1978] 소수 찾기  (0) 2022.07.31

    댓글

Designed by Tistory.