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

#define MAX_SIZE 100

typedef struct {
    int items[MAX_SIZE];
    int top;
} Stack;

Stack* createStack() {
    Stack* s = (Stack*)malloc(sizeof(Stack));
    s->top = -1;
    return s;
}

void push(Stack* s, int x) {
    if (s->top == MAX_SIZE - 1) {
        printf("Stack Overflow\n");
        return;
    }
    s->items[++(s->top)] = x;
}

int pop(Stack* s) {
    if (s->top == -1) {
        printf("Stack Underflow\n");
        return -1;
    }
    return s->items[(s->top)--];
}

int isEmpty(Stack* s) {
    return s->top == -1;
}

typedef struct {
    Stack* s1;
    Stack* s2;
} Queue;

Queue* createQueue() {
    Queue* q = (Queue*)malloc(sizeof(Queue));
    q->s1 = createStack();
    q->s2 = createStack();
    return q;
}

void enqueue(Queue* q, int x) {
    push(q->s1, x);
}

int dequeue(Queue* q) {
    int x;
    if (isEmpty(q->s1) && isEmpty(q->s2)) {
        printf("Queue is empty\n");
        return -1;
    }
    if (isEmpty(q->s2)) {
        while (!isEmpty(q->s1)) {
            x = pop(q->s1);
            push(q->s2, x);
        }
    }
    return pop(q->s2);
}

int main() {
    Queue* q = createQueue();
    
    enqueue(q, 1);
    enqueue(q, 2);
    enqueue(q, 3);
    
    printf("%d\n", dequeue(q));
    printf("%d\n", dequeue(q));
    
    enqueue(q, 4);
    
    printf("%d\n", dequeue(q));
    printf("%d\n", dequeue(q));
    
    return 0;
}