c语言循环队列ADT的实现及应用
时间: 2023-09-02 12:07:39 浏览: 64
循环队列是一种特殊的队列,它的队尾指针指向最后一个元素的下一个位置,队头指针指向队列中第一个元素。当队列满时,队尾指针和队头指针相等,但此时队列不是空的。
循环队列的实现可以使用数组来存储元素,定义一个结构体来表示队列,其中包含队列的头指针、尾指针和数组元素。下面是循环队列ADT的实现:
```
typedef struct {
int *base; // 队列的存储空间
int front; // 队头指针
int rear; // 队尾指针
int size; // 队列的最大长度
} Queue;
void InitQueue(Queue *q, int size) {
q->base = (int *)malloc(size * sizeof(int));
q->front = q->rear = 0;
q->size = size;
}
void EnQueue(Queue *q, int x) {
if ((q->rear + 1) % q->size == q->front) {
printf("Queue is full.\n");
return;
}
q->base[q->rear] = x;
q->rear = (q->rear + 1) % q->size;
}
int DeQueue(Queue *q) {
if (q->front == q->rear) {
printf("Queue is empty.\n");
return -1;
}
int x = q->base[q->front];
q->front = (q->front + 1) % q->size;
return x;
}
int GetQueueLength(Queue *q) {
return (q->rear - q->front + q->size) % q->size;
}
```
使用循环队列可以方便地实现一些算法,如广度优先搜索(BFS)和滑动窗口等。下面是一个使用循环队列实现滑动窗口的例子:
```
void SlidingWindow(int *a, int n, int k) {
Queue q;
InitQueue(&q, k);
int i;
for (i = 0; i < k; i++) {
while (GetQueueLength(&q) > 0 && a[i] >= a[q.base[q.rear-1]]) {
DeQueue(&q);
}
EnQueue(&q, i);
}
for (; i < n; i++) {
printf("%d ", a[q.base[q.front]]);
while (GetQueueLength(&q) > 0 && a[i] >= a[q.base[q.rear-1]]) {
DeQueue(&q);
}
while (GetQueueLength(&q) > 0 && q.base[q.front] <= i - k) {
DeQueue(&q);
}
EnQueue(&q, i);
}
printf("%d\n", a[q.base[q.front]]);
}
```
该函数可以实现在一个长度为n的数组a中,找出每个长度为k的子数组中的最大值。
阅读全文