#include <stdio.h>
#include <stdlib.h>
typedef struct {
int max;
int num;
int front;
int rear;
int* que;
} Queue;
int Initialize(Queue* q, int max) {
q->num = q->front = q->rear = 0;
if ((q->que = (int*)calloc(max, sizeof(int))) == NULL) {
q->max = 0;
return -1;
}
q->max = max;
return 0;
}
void Terminate(Queue* q) {
if (q->que)
free(q->que);
q->max = q->num = q->front = q->rear = 0;
}
int Enque(Queue* q, int x) {
if (q->num >= q->max)
return -1;
else {
q->num++;
q->que[q->rear++] = x;
if (q->rear == q->max)
q->rear = 0;
return 0;
}
}
int Deque(Queue* q, int* x) {
if (q->num <= 0)
return -1;
else {
q->num--;
*x = q->que[q->front++];
if (q->front == q->max)
q->front = 0;
return 0;
}
}
int Peek(const Queue* q, int* x) {
if (q->num <= 0)
return -1;
*x = q->que[q->front];
return 0;
}
void Clear(Queue* q) {
q->num = q->front = q->rear = 0;
}
int Capacity(const Queue* q) {
return q->max;
}
int Size(const Queue* q) {
return q->num;
}
int Empty(const Queue* q) {
return q->num <= 0;
}
int IsFull(const Queue* q) {
return q->num >= q->max;
}
int Search(const Queue* q, int x) {
for (int i = 0; i < q->num; i++) {
int idx = (q->front + i) % q->max;
if (q->que[idx] == x)
return idx;
}
return -1;
}