#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK_SIZE 5

typedef struct {
    int key;
} element;

// element 구조체를 저장할 수 있는 stack이라는 배열을 MAX_STACK_SIZE개 크기로 만듦
element stack[MAX_STACK_SIZE];

int top = -1;

void stackFull();
void stackEmpty();

// push()
// top 증가
//    ↓
// 새 위치 결정
//    ↓
// item 삽입

// pop()
// 현재 top 데이터 꺼냄
//        ↓
//       반환
//        ↓
// top 감소
// pop()은 배열 안의 값을 실제로 지우는 것이 아니라, 
// top을 감소시켜 그 값을 "스택에서 더 이상 사용하지 않는 값"으로 만드는 것

// push는 밖에 있는 데이터를 스택 안으로 "넣는" 함수라서 입력값(item)이 필요, 반환할 것은 없음
void push(element item)
{
    if(top >= MAX_STACK_SIZE-1)
    {
        stackFull();
    }
    stack[++top] = item; 
    // top증가 -> item 삽입 , top의 증가된 값을 바로 stack 배열의 인덱스로 사용
    // top = top + 1;
    // stack[top] = item; 이거의 줄임임
}

// pop은 스택 안에 있는 데이터를 밖으로 "꺼내 주는" 함수라서 입력값은 필요 없음, 
// 그리고 꺼낸 데이터를 반환해야 함,스택에서는 가장 위에 값을 꺼냄. 즉 어떤 데이터를 꺼낼지 사용자가 선택하지 않음. 이미 알고 있기 때문
// 그래서 매개변수가 필요하지 않음
// 반환형이 element여야 데이터를 함수 밖으로 전달할 수 있음. 
element pop()
{
    if(top ==-1)
    {
        stackEmpty();
    }
    return stack[top--]; //item제거 -> top감소 (top은 항상 가장 먼저 삭제될 데이터를 가르켜야함=가장 마지막에 삽입된 데이터를 가르킴)
}

void stackFull()
{
    fprintf(stderr, "Stack is full, cannnot add element"); 
    // fprintf: 어디에 출력할 것인지를 직접 지정할 수 있는 함수
    // stderr: 표준 오류 출력
    exit(EXIT_FAILURE); // 프로그램 전체를 비정상 종료
}

void stackEmpty()
{
    fprintf(stderr, "Stack is empty\n");
    exit(EXIT_FAILURE);
}

int main() {
  
    element item1 = {10}; //element item1 = {10}; → 변수를 만들면서 초기화
    // element item1;   2줄과 위의 한줄은 동일한 뜻
    // item1.key = 10;
    element item2 = {20};
    element item3 = {30};

    element result;

    /* Push */
    push(item1);
    printf("push : %d, top = %d\n", stack[top].key, top);

    push(item2);
    printf("push : %d, top = %d\n", stack[top].key, top);

    push(item3);
    printf("push : %d, top = %d\n", stack[top].key, top);


    /* Pop */
    result = pop();
    printf("pop  : %d, top = %d\n", result.key, top);

    result = pop();
    printf("pop  : %d, top = %d\n", result.key, top);

    result = pop();
    printf("pop  : %d, top = %d\n", result.key, top);

    return 0;
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: