월레스와 그로밋: 코딩의 날

스택(stack) 본문

Etc/C

스택(stack)

구운 감자 2023. 7. 31. 18:14
스택(stack)이란?

스택은 후입선출(Last In First Out)로 동작한다.

가장 마지막에 들어간 데이터가 가장 먼저 빠져나간다는 뜻이다.

 

스택이 실생활에 사용되는 예

 

 

제일 마지막에 작성한 코드부터 차례대로 되돌아가기 위해 우리는 Ctrl + z 키를 사용한다.

 

 

물건을 밑에서부터 차근차근 쌓아 올리고 계산할때는 맨 위, 즉, 제일 마지막에 올려서 위에 놓인 물건부터 계산대로 옮긴다.

 

 

컴퓨터는 사람처럼 계산을 할 수 없기 때문에 후위 표기법과 같이 계산한다.

 

쨌든 맨 처음 넣었던 데이터를 확인하려면 그 위에 쌓여있는 다른 데이터들을 꺼내야 확인할 수 있다.

 

스택의 구성

 

스택 구현

1
2
3
4
typedef struct Stack {
    int arr[100];
    int top;
}stack;
cs

 

스택의 구조체 부분에는 100칸짜리 int형 배열과 맨 위에 있는 데이터를 저장할 수 있는 변수가 구성 되어있다.

 

1
2
3
4
void init(stack* s)
{
    s->top = -1;
}
cs

 

스택을 만들때마다 초기화 시켜주는 함수이다.

배열은 인덱스 0부터 시작하니, top 변수에 -1을 넣어 초기화시켜줘서 스택이 비어있음을 말한다.

 

1
2
3
4
5
6
int is_empty(stack* s)
{
    if (s->top == -1)
        return 1;
    return 0;
}
cs

 

스택이 비어있는지 확인하는 함수이다.

만약 top 변수에 -1이 들어가있으면 스택이 비었다는 뜻이므로 1('참')을 반환하고

비어있지 않으면 0('거짓')을 반환한다.

 

1
2
3
4
5
6
int is_full(stack* s)
{
    if (s->top == 99)
        return 1;
    return 0;
}
cs

 

스택이 가득 차있는지 확인하는 함수이다.

배열의 맨 끝 인덱스가 99이므로 top변수의 값이 99이면 1을 반환하고

그렇지 않다면 아직 가득 차지 않았으므로 0을 반환한다.

 

1
2
3
4
5
6
7
8
9
void push(stack* s, int data)
{
    if (is_full(s)) {
        printf("\nStack is full.\n");
        exit(1);
    }
    printf("pushed: %d\n", data);;
    s->arr[++(s->top)] = data;
}
cs

 

데이터를 넣는 함수이다.

만약 스택이 가득 찼을 시 is_full 함수에서 1을 반환하여 스택이 가득 찼다는 문구를 남긴 뒤 시스템을 종료한다.

스택이 가득 차지 않았으면 push된 데이터를 출력한뒤 arr배열 현재 인덱스의 다음 인덱스에 데이터를 넣는다.

data = 1 일때, 현재 스택이 비어있다면 top = -1 이고, pushed : 1을 출력한다음 '++' 연산자가 앞에 놓여있으므로 배열의 인덱스가 0일때 data(1)를 넣는다.

 

1
2
3
4
5
6
7
8
int pop(stack* s)
{
    if (is_empty(s)) {
        printf("\nStack is empty.\n");
        exit(1);
    }
    return s->arr[(s->top)--];
}
cs

 

데이터를 빠져나오게 하는 함수이다.

만약 빼낼 데이터가 없는 스택이 비어있는 상태일 때 is_empty함수에서 1을 반환하여 스택이 비었다는 문구를 남긴뒤 시스템을 종료한다.

아직 빼낼 데이터가 있다면 top에 위치한 데이터를 반환시켜주고난 후  top이 있던 인덱스가 한칸 빠지기 때문에 '--'를 후에 해준다.

 

1
2
3
4
5
6
7
8
int peek(stack* s)
{
    if (is_empty(s)) {
        printf("Stack is empty.\n");
        exit(1);
    }
    return s->arr[(s->top)];
}
cs

 

현재 top에 있는 데이터를 알려주는 함수이다.

스택이 비어있을시에는 pop함수와 마찬가지로 스택이 비어있음을 알린뒤 시스템을 종료한다.

비어있지 않다면 현재 스택의 맨 끝(위, top)에 위치한 데이터를 반환한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    stack s;
    init(&s);    // stack 
 
    push(&s, 3);
    push(&s, 2);
    push(&s, 1);
 
    printf("\ntop check : %d\n\n", peek(&s));
    printf("pop : %d\n"pop(&s));
    printf("pop : %d\n"pop(&s));
    printf("pop : %d\n"pop(&s));
 
    printf("\npop : %d\n"pop(&s));    // empty
 
    return 0;
}
cs

 

스택에 데이터를 3, 2, 1 순으로 집어넣은 뒤 top에 있는 데이터가 무엇인지 확인한다. 그리고 pop함수를 이용해서 맨 나중에 들어간 데이터부터 빼내며 출력한다.

마지막에는 모든 데이터가 다 빠져나가서 스택이 비어있으니 스택이 비어있다고 알린 후 시스템을 종료한다.

 

 

결과♬

'Etc > C' 카테고리의 다른 글

rsp_game(묵찌빠 게임)  (0) 2025.01.26
hourglass(모래시계)  (0) 2025.01.26
369  (0) 2025.01.26
이중연결리스트 사용 예시 (대기자명단)  (0) 2023.07.27
노드(Node)  (0) 2023.07.26