백준 코드 공부/C언어

백준 10828 : 스택 (C언어)

GUuu9 2021. 11. 27. 13:21

문제 10828번: 스택 (acmicpc.net)

 

10828번: 스택

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

www.acmicpc.net


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

int stack[10001]={0,};
char command[6];
int stacknum = 0;

void callpush(int value){
    stack[stacknum] = value;
    stacknum++;
}
void callpop(){
    if(stack[stacknum-1] == 0)
        printf("-1\n");
    else{
        printf("%d\n", stack[stacknum-1]);
        stack[stacknum-1] = 0;
        stacknum--;
    }
}
void callsize(){
    printf("%d\n", stacknum);
}
void callempty(){
    if(stacknum==0&&stack[stacknum]==0)
        printf("1\n");
    else
        printf("0\n");
}
void calltop(){
    if(stacknum==0&&stack[stacknum]==0)
        printf("-1\n");
    else
        printf("%d\n", stack[stacknum-1]);
}

int main() {
	int task, i, value;
	char *push = "push", *pop = "pop", *size = "size", *empty = "empty", *top = "top";
	scanf("%d", &task);
	
	for(i=0;i<task;i++){
	    
	    scanf("%s", command);
	    
	    if(strcmp(command, push) == 0){
	        scanf("%d", &value);
	        callpush(value);
	    }
	    else if(strcmp(command, pop) == 0){
	        callpop();
	    }
	    else if(strcmp(command, size) == 0){
	        callsize();
	    }
	    else if(strcmp(command, empty) == 0){
	        callempty();
	    }
	    else if(strcmp(command, top) == 0){
	        calltop();
	    }
	}
}

스택이란 우선 데이터가 들어올때 하노이탑 처럼 맨 아래부터 위로 쌓아 올라가고, 빠질때는 맨 위에 있는 것부터 하나씩 빠지는 상태 입니다. First in Last out 구조입니다.

배열에 있어서는 데이터가 들어올때 arr[0]부터 들어오기 시작해서 ar[1] -> arr[2] -> ... -> arr[top]까지 순차적으로 들어옵니다. 빠질때는 하나씩 줄어가며 다시 내려옵니다. 

먼저 모든 함수에서 사용해야 할 데이터는 전역 변수로 선언해줍니다. 

int stack[10001]={0,};
char command[6];
int stacknum = 0;

명령어의 수는 10000개 보다 적다고 했기 때문에 10001개 만큼 설정 했습니다.

command의 경우 입력되는 명령어의 길이가 길어야 5글자이므로 6만큼의 크기로 설정했습니다.

stacknum의 경우 사용할 stack배열의 현재 위치값을 위해 사용합니다.

int main() {
	int task, i, value;
	char *push = "push", *pop = "pop", *size = "size", *empty = "empty", *top = "top";
	scanf("%d", &task);
	
	for(i=0;i<task;i++){
	    
	    scanf("%s", command);
	    
	    if(strcmp(command, push) == 0){
	        scanf("%d", &value);
	        callpush(value);
	    }
	    else if(strcmp(command, pop) == 0){
	        callpop();
	    }
	    else if(strcmp(command, size) == 0){
	        callsize();
	    }
	    else if(strcmp(command, empty) == 0){
	        callempty();
	    }
	    else if(strcmp(command, top) == 0){
	        calltop();
	    }
	}
}

메인 함수를 입니다.

task로 명령 받을 개수를 받습니다. value 의 경우는 push 명령에서 입력하는 숫자도 추가로 넣기 때문에 추가했습니다.

char의 경우 입력된 command와 비교해서 <string.h>에 있는 문자 비교 strcmp를 사용해 동일한 입력이라면 해당 명령을 수행하도록 했습니다. strcmp함수의 경우 두개의 값이 동일한 경우 0을 반환합니다. 

void callpush(int value){
    stack[stacknum] = value;
    stacknum++;
}
void callpop(){
    if(stack[stacknum-1] == 0)
        printf("-1\n");
    else{
        printf("%d\n", stack[stacknum-1]);
        stack[stacknum-1] = 0;
        stacknum--;
    }
}
void callsize(){
    printf("%d\n", stacknum);
}
void callempty(){
    if(stacknum==0&&stack[stacknum]==0)
        printf("1\n");
    else
        printf("0\n");
}
void calltop(){
    if(stacknum==0&&stack[stacknum]==0)
        printf("-1\n");
    else
        printf("%d\n", stack[stacknum-1]);
}

이제 동작하는 함수들 입니다.

callpush 는 추가로 입력 받은 value를 가져와 현재의 배열의 위치에 값을 저장합니다. 이후에 stacknum을 증가 시켜 다음 배열 위치를 가리키도록 합니다.

callpop 은 가장 마지막에 들어간 값을 출력하고 제거하는 함수 입니다. stacknum은 비어있는 최상위 값을 가리키므로 -1된 위치의 값을 확인하고 출력합니다. 이후에 0으로 바꾸어 해당 위치를 비워주고 stacknum을 비워줍니다. 만약 최상위 값이 이미 비어 있다면 -1을 출력합니다.

callsize 는 현재 배열의 크기를 확인합니다. 크기는 1부터 시작하고 배열은 0번부터 시작하므로 stacknum의 번호가 현재 배열의 크기가 됩니다.

callempty 는 배열이 비어있는지 아닌지를 확인하여 값을 출력 합니다. 0번 배열의 값만 확인 해보고 값이 0이라면 1 아니라면 0을 출력 합니다.

calltop은 현재 배열에서 가장 마지막에 들어온 값을 출력합니다. 배열이 비어있는 경우 -1을 출력해줍니다.


큐(queue) 2021.11.27 - [백준 코드 공부/C언어] - 백준 10845 : 큐 (C언어)

 

백준 10845 : 큐 (C언어)

문제 10845번: 큐 (acmicpc.net) #include #include int queue[10001]={0,}; char command[6]; int queuenum = 0; void callpush(int value); void callpop(); void callsize(); void callempty(); void callfron..

531522szerodesire.tistory.com

덱(deque) 2021.11.27 - [백준 코드 공부/C언어] - 백준 10866 : 덱 (C언어)

 

백준 10866 : 덱 (C언어)

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

531522szerodesire.tistory.com


Git Hub

BaekJoon-Study/10828:스택.c at C · GUuu9/BaekJoon-Study (github.com)

 

GitHub - GUuu9/BaekJoon-Study

Contribute to GUuu9/BaekJoon-Study development by creating an account on GitHub.

github.com