헤더

#ifndef _stack
#define _stack
typedef struct _node
{
    int data;
    struct _node* next;
}Node;
typedef struct _stack
{
    Node* head;
    int numOfData;
}Stack;
void DataInit(Stack* pstack);
int Menu(int* SMenu);
int Push(Stack* pstack);
int Peek(Stack* pstack);
int Pop(Stack* pstack);
#endif

소스

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include"head.h"
void DataInit(Stack* pstack)
{
    pstack->head = NULL;
    pstack->numOfData = 0;
    printf("데이터 초기화 완료\n\n");
}
int Menu(int *pSMenu)
{
    printf("1.숫자 추가\n");
    printf("2.마지막으로 들어간 숫자 확인\n");
    printf("3.마지막으로 들어간 숫자 삭제\n");
    printf("4.종료\n");
    scanf("%d",pSMenu);
    return 1;
}
int Push(Stack*pstack)
{
    int InData;
    printf("추가할 숫자를 입력하시오\n");
    scanf("%d", &InData);
    Node* newStack = (Node*)malloc(sizeof(Node));
    newStack->data = InData;
    newStack->next = pstack->head;
    
    pstack->head=newStack;
    (pstack->numOfData)++;
    printf("추가 완료\n");
    return 1;
}
int Peek(Stack* pstack)
{
    if(pstack->numOfData == 0)
        printf("데이터가 없습니다\n");
    else
        printf("가장 위에 있는 숫자는 %d, 저장된 숫자의 개수는%d\n", pstack->head->data,pstack->numOfData);
    return 1;
}
int Pop(Stack* pstack)
{
    if (pstack->numOfData == 0)
        printf("데이터가 없습니다");
    else
    {
        int bData = pstack->head->data;
        Node* bNode = pstack->head;
        pstack->head = pstack->head->next;
        (pstack->numOfData)--;
        printf("삭제 완료\n");
    }
    return 1;
}

메인

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include"head.h"
int main()
{
    Stack stack;
    int SMenu=0;
    DataInit(&stack);
    while (SMenu!=4)
    {
        Menu(&SMenu);
        //숫자 추가(push)
        if (SMenu == 1)
        {
            Push(&stack);
        }
        //숫자 확인(peek)
        else if (SMenu == 2)
        {
            Peek(&stack);
        }
        //숫자 삭제(pop)
        else if (SMenu == 3)
        {
            Pop(&stack);
        }
    }
    return 1;
}

예제에서는 empty체크를

int SIsEmpty(Stack * pstack)
{
    if(pstack->head == NULL)
        return TRUE;
    else
        return FALSE;
}

이 함수를 쓰던데 저는 그냥 stack 구조체에 변수추가해서 숫자 추가할때 마다 1씩 올라가게 해봤는데

두방식의 차이점이 있나요?

그리고

void DataInit(Stack* pstack)

이 함수를 반환형을 int로 해서 return 1;로 끝냈는데 반환형식으로만 구분되는 함수를 오버로드 할 수 없다고 뜨던데 무슨말인가요?

스택 관련 자료도 추천해주시면 감사하겠습니다.