#include <stdio.h>
#include <stdlib.h>

#include <stdbool.h>

#define MAX_SIZE 100

typedef struct 
{
    int key;
    int data;
} element;

typedef struct 
{
    element* item;
    int top;
} Stack;

void CreateStack(Stack* sp)
{
    element ele[MAX_SIZE];

    int i=0;
    for(i=0; i<100; i++)
    {
        ele[i].data = i+1000;
        ele[i].key = i+1000;
    }
    
    //함수 내부에 정적변수'는 함수 밖으로 나가면. 소멸 되거나.
    //남더라도. 변경이 될 수 있을겁니다.
    sp->item = ele;
    sp->top = -1;
    printf("CreateStack() ele %x\n", ele);
    printf("CreateStack() sp->item %x\n", sp->item);
    printf("CreateStack() sp->item->data %d\n", sp->item->data);
    printf("CreateStack() sp->item->key %d\n", sp->item->key);
}

bool Push(Stack* sp, element ele)
{
    if (sp->top == 100)
    {
        printf("error : stack is full");
        return false;
    }
    else
    {
        sp->top++;
        printf("Push() sp->item[sp->top].data %d\n", sp->item[sp->top].data);
        printf("Push() sp->item[sp->top].key %d\n", sp->item[sp->top].key);

        sp->item[sp->top].data = ele.data;
        sp->item[sp->top].key = ele.key;
        printf("Push() sp->top %d\n", sp->top);
        return true;
    }
    return true;
}

element Pop(Stack* sp)
{
    if (sp->top == -1)
    {
        printf("error : stack is empty\n");
    }
    else
    {
        printf("Pop() sp->top %d\n", sp->top);
        element temp;
        temp = sp->item[sp->top];
        sp->top--;
        return temp;
    }
}

bool IsFull(Stack* sp)
{
    if (sp->top == 100)
    {
        printf("Stack is full\n");
        return true;
    }
    else
    {
        printf("Stack is not full\n");
        return false;
    }
}

bool IsEmpty(Stack* sp)
{
    if (sp->top == -1)
    {
        printf("Stack is empty\n");
        return true;
    }
    else
    {
        printf("Stack is not empty\n");
        return false;
    }
}

void PrintStack(Stack* sp)
{
    for (int i = 0; i < sp->top; i++)
    {
        printf("%d %d\n", sp->item[i].key, sp->item[i].data);
    }
}

int main()
{
    element el1;
    el1.data = 10;
    el1.key = 1;

    element el2;
    el2.data = 20;
    el2.key = 2;

    element el3;
    el3.data = 30;
    el3.key = 3;

    element el4;
    el4.data = 40;
    el4.key = 4;

    Stack st1;
    Stack* stp;
    stp = &st1;

    CreateStack(stp);
    printf("main() stp->item %x\n", stp->item);
    printf("main() stp->top %d\n", stp->top);

    for (int i = 0; i < 10; i++)
    {
        printf("main() %d %d\n", stp->item[i].key, stp->item[i].data);
    }
    
    Push(stp, el1);
    Push(stp, el2);
    Push(stp, el3);
    Push(stp, el4);
    Push(stp, el1);
    Push(stp, el2);

    element tmp1 = Pop(stp);

    for (int i = 0; i < stp->top; i++)
    {
        printf("%d %d\n", stp->item[i].key, stp->item[i].data);
    }

    PrintStack(stp);
    IsFull(stp);
    IsEmpty(stp);
    return 0;
}