#include <stdio.h>
#define MAX 5   // queue size

int queue[MAX];
int front = -1, rear = -1;

/* ---------- ENQUEUE ---------- */
void enqueue(int item) {
    if ((rear + 1) % MAX == front) {
        printf("Queue Overflow! Cannot insert %d\n", item);
        return;
    }

    if (front == -1) {   // first insertion
        front = 0;
        rear = 0;
    } else {
        rear = (rear + 1) % MAX;
    }

    queue[rear] = item;
    printf("Inserted %d\n", item);
}

/* ---------- DEQUEUE ---------- */
void dequeue() {
    if (front == -1) {
        printf("Queue Underflow! Nothing to delete\n");
        return;
    }

    printf("Deleted %d\n", queue[front]);

    if (front == rear) {   // last element removed
        front = -1;
        rear = -1;
    } else {
        front = (front + 1) % MAX;
    }
}

/* ---------- DISPLAY ---------- */
void display() {
    int i;

    if (front == -1) {
        printf("Queue is empty\n");
        return;
    }

    printf("Queue elements: ");
    i = front;
    while (1) {
        printf("%d ", queue[i]);
        if (i == rear)
            break;
        i = (i + 1) % MAX;
    }
    printf("\n");
}

/* ---------- MAIN (MENU) ---------- */
int main() {
    int choice, item;

    while (1) {
        printf("\n--- CIRCULAR QUEUE MENU ---\n");
        printf("1. Insert (Enqueue)\n");
        printf("2. Delete (Dequeue)\n");
        printf("3. Display Queue\n");
        printf("4. Exit\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                printf("Enter element to insert: ");
                scanf("%d", &item);
                enqueue(item);
                break;

            case 2:
                dequeue();
                break;

            case 3:
                display();
                break;

            case 4:
                printf("Exiting program...\n");
                return 0;

            default:
                printf("Invalid choice\n");
        }
    }
}