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

struct stack
{
    int size;
    int top;
    int *arr;
};

int isempty(struct stack *ptr)
{
    if (ptr->top == -1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int isfull(struct stack *ptr)
{
    if (ptr->top == ptr->size - 1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

void push(struct stack *ptr, int val)
{
    if (isfull(ptr))
    {
        printf("stack is overflow !canot push %d to the stack\n", val);
        // return -1;
    }
    else
    {
        ptr->top++;
        ptr->arr[ptr->top] = val;
    }
}

int pop(struct stack *ptr)
{
    if (isempty(ptr))
    {
        printf("stack is overflow !canot pop from the stack\n");
        return -1;
    }
    else
    {
        int val = ptr->arr[ptr->top];
        ptr->top--;
        return val;
    }
}

int peek(struct stack* ptr){
    if (isempty(ptr))
    {
        printf("stack is empty! Cannot peek\n");
        return -1; 
    }
    else{
        int val =  ptr->arr[ptr->top];
        ptr->top--;
        return val;
    }
}

void printStack(struct stack *ptr)
{
    printf("Stack: ");
    for (int i = ptr->top; i >= 0; i--)
    {
        printf("%d ", ptr->arr[i]);
    }
    printf("\n");
}

int main()
{
    struct stack *s = (struct stack *)malloc(sizeof(struct stack));
    s->size = 10;
    s->top = -1;
    s->arr = (int *)malloc(s->size * sizeof(int));

    printf("before push, full %d\n", isfull(s));
    printf("before push, empty %d\n", isempty(s));

    push(s, 1);
    push(s, 2);
    push(s, 3);
    push(s, 4);
    push(s, 5);
    push(s, 6);
    push(s, 7);
    push(s, 8);
    push(s, 9);
    push(s, 10);

    printf("after push, full  %d\n", isfull(s));
    printf("after push, empty %d\n", isempty(s));
    
    printStack(s);

    printf("Peek: %d\n", peek(s));
    // printf("Peek: %d\n", peek(s));
    // printf("Peek: %d\n", peek(s));

    printf("popped %d from the stack\n", pop(s));
    printf("popped %d from the stack\n", pop(s));
    printf("popped %d from the stack\n", pop(s));
    printf("popped %d from the stack\n", pop(s));
    printf("popped %d from the stack\n", pop(s));

    // printf("After pop, full  %d\n", isfull(s));
    // printf("After pop, empty %d\n", isempty(s));

    printStack(s);

    return 0;
}