

#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 Overflow! Cannot push %d to the stack\n", val);
    }
    else
    {
        ptr->top++;
        ptr->arr[ptr->top] = val;
    }
}
int pop(struct stack *ptr)
{
    if (isEmpty(ptr))
    {
        printf("Stack Underflow! Cannot pop from the stack\n");
        return -1;
    }
    else
    {
        int val = ptr->arr[ptr->top];
        ptr->top--;
        return val;
    }
}
void enqueue(struct stack *ptr, int x)
{
    push(ptr, x);
}
int dequeue(struct stack *ptr)
{
    if (isEmpty(ptr))
    {
        printf("Queue is empty");
        exit(0);
    }
    int x = pop(ptr);
    if (isEmpty(ptr)){
        return x;
    }
    int i = dequeue(ptr);
    push(ptr, x);
    return i;
}
int main()
{
    int s;
    struct stack *sp = (struct stack *)malloc(sizeof(struct stack));
    printf("enter the size of queue : ");
    scanf("%d", &s);
    sp->size = s;
    sp->top = -1;
    sp->arr = (int *)malloc(sp->size * sizeof(int));
    printf("Stack has been created successfully\n");
    enqueue(sp, 9);
    enqueue(sp, 99);
    enqueue(sp, 999);
    enqueue(sp, 9999);
    printf("dequeued element is : %d\n", dequeue(sp));
    printf("dequeued element is : %d\n", dequeue(sp));
    printf("dequeued element is : %d\n", dequeue(sp));
    printf("dequeued element is : %d\n", dequeue(sp));
    return 0;
}