#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef struct Queue {
int *data;
int head;
int tail;
int length;
int cnt;
} Queue;
Queue *init(int n) {
Queue *q = (Queue *)malloc(sizeof(Queue));
q->data = (int *)malloc(sizeof(int) * n);
q->length = n;
q->head = 0;
q->tail = 0;
q->cnt = 0;
return q;
}
int front(Queue *q) {
return q->data[q->head];
}
int empty(Queue *q) {
return q->cnt == 0;
}
int expand(Queue *q) {
if (!q) return 0;
int extr_size = q->length;
int *p = NULL;
while (extr_size) {
p = (int *)malloc(sizeof(int) * (q->length+extr_size));
if (q) break;
extr_size >>= 1;
}
if (!p) return 0;
for (int i = q->head, j = 0; j < q->cnt; i++, j++) {
p[i] = q->data[i%q->length];
}
free(q->data);
q->length += extr_size;
q->head = 0;
q->tail = q->cnt;
q->data = p;
return 1;
}
int push(Queue *q, int val) {
if (!q) return 0;
if (q->cnt >= q->length) {
if (!expand(q)) return 0;
printf("expand success! Queue->length(%d)\n", q->length);
}
q->data[q->tail++] = val;
q->tail %= q->length;
q->cnt++;
return 1;
}
#if 0
int push(Queue *q, int val) {
if (!q) return 0;
if (q->cnt >= q->length) return 0;
q->data[q->tail++] = val;
q->tail %= q->length;
q->cnt++;
return 1;
}
#endif
int pop(Queue *q) {
if (!q) return 0;
if (empty(q)) return 0;
q->head++;
q->head %= q->length;
q->cnt--;
return 1;
}
void output(Queue *q) {
printf("Queue : [");
for (int i = q->head, j = 0; j < q->cnt; i++, j++) {
printf("%d ", q->data[i%q->length]);
}
printf("]\n");
return ;
}
void clear(Queue *q) {
if (!q) return ;
free(q->data);
free(q);
return ;
}
int main() {
srand(time(0));
#define max_op 20
Queue *q = init(max_op);
for (int i = 0; i < max_op*3; i++) {
int val = rand() % 100;
int op = rand() % 4;
switch (op) {
case 0:
case 1:
case 2: {
printf("push %d to Queue = %d\n", val, push(q, val));
} break;
case 3: {
printf("pop %d from the Queue = ", front(q));
printf("%d\n", pop(q));
} break;
}
output(q), printf("\n");
}
#undef max_op
clear(q);
return 0;
}
循环队列及扩容
最新推荐文章于 2023-01-07 09:15:23 发布