#include #include #define MAX_SIZE 5 // Static array capacity typedef struct { void *data[MAX_SIZE]; int front; int rear; int count; } PtrQueue; // Initialize queue void initQueue(PtrQueue *q) { q->front = 0; q->rear = -1; q->count = 0; } // Check if queue is empty int isEmpty(PtrQueue *q) { return q->count == 0; } // Check if queue is full int isFull(PtrQueue *q) { return q->count == MAX_SIZE; } // Push_back (enqueue) int push_back(PtrQueue *q, void *ptr) { if (isFull(q)) { printf("Queue overflow! Cannot enqueue.\n"); return 0; } q->rear = (q->rear + 1) % MAX_SIZE; q->data[q->rear] = ptr; q->count++; return 1; } // Pop_front (dequeue) void *pop_front(PtrQueue *q) { if (isEmpty(q)) { printf("Queue underflow! Cannot dequeue.\n"); return NULL; } void *item = q->data[q->front]; q->front = (q->front + 1) % MAX_SIZE; q->count--; return item; } // Get queue size int size(PtrQueue *q) { return q->count; } // Example object typedef struct { int id; char name[32]; } Person; Person *newPerson(int id, const char *name) { Person *p = malloc(sizeof(Person)); p->id = id; snprintf(p->name, sizeof(p->name), "%s", name); return p; } // Example usage int main() { PtrQueue q; initQueue(&q); push_back(&q, newPerson(1, "Alice")); push_back(&q, newPerson(2, "Bob")); push_back(&q, newPerson(3, "Charlie")); printf("Queue size: %d\n", size(&q)); while (!isEmpty(&q)) { Person *p = (Person *)pop_front(&q); printf("Dequeued: id=%d name=%s\n", p->id, p->name); free(p); } printf("Queue empty? %s\n", isEmpty(&q) ? "Yes" : "No"); return 0; }