项目开发中经常使用循环队列,请制作可伸缩循环队列的静态为和动态库。至少包括以下功能: (1)创建循环队列; (2)入队和出队; (3)根据需要自动伸缩; (4)循环队列销毁。的代码
时间: 2024-05-16 12:12:11 浏览: 89
“ToB”产品必备特性:Pravega的动态弹性伸缩
好的,这是一个技术问题,我可以回答。以下是可伸缩循环队列的静态库和动态库的代码:
静态库:
```c
#include <stdlib.h>
#include <stdbool.h>
#define QUEUE_INIT_SIZE 10
#define QUEUE_INCREMENT 5
typedef struct {
int *base; // 队列首地址
int front; // 队头指针
int rear; // 队尾指针
int size; // 队列长度
int capacity; // 队列容量
} SqQueue;
/**
* 初始化队列
*/
bool InitQueue(SqQueue *queue) {
queue->base = (int *) malloc(sizeof(int) * QUEUE_INIT_SIZE);
if (!queue->base) {
return false;
}
queue->front = queue->rear = 0;
queue->size = 0;
queue->capacity = QUEUE_INIT_SIZE;
return true;
}
/**
* 队列是否为空
*/
bool IsQueueEmpty(SqQueue *queue) {
return queue->front == queue->rear;
}
/**
* 入队
*/
bool EnQueue(SqQueue *queue, int elem) {
if ((queue->rear + 1) % queue->capacity == queue->front) {
// 队列已满,需要扩容
int *new_base = (int *) realloc(queue->base, (queue->capacity + QUEUE_INCREMENT) * sizeof(int));
if (!new_base) {
return false;
}
queue->base = new_base;
queue->capacity += QUEUE_INCREMENT;
}
queue->base[queue->rear] = elem;
queue->rear = (queue->rear + 1) % queue->capacity;
queue->size++;
return true;
}
/**
* 出队
*/
bool DeQueue(SqQueue *queue, int *elem) {
if (IsQueueEmpty(queue)) {
return false;
}
*elem = queue->base[queue->front];
queue->front = (queue->front + 1) % queue->capacity;
queue->size--;
return true;
}
/**
* 销毁队列
*/
void DestroyQueue(SqQueue *queue) {
free(queue->base);
queue->base = NULL;
queue->front = queue->rear = queue->size = queue->capacity = 0;
}
```
动态库:
```c
#include <stdlib.h>
#include <stdbool.h>
#define QUEUE_INIT_SIZE 10
#define QUEUE_INCREMENT 5
typedef struct {
int *base; // 队列首地址
int front; // 队头指针
int rear; // 队尾指针
int size; // 队列长度
int capacity; // 队列容量
} SqQueue;
/**
* 初始化队列
*/
bool InitQueue(SqQueue *queue) {
queue->base = (int *) malloc(sizeof(int) * QUEUE_INIT_SIZE);
if (!queue->base) {
return false;
}
queue->front = queue->rear = 0;
queue->size = 0;
queue->capacity = QUEUE_INIT_SIZE;
return true;
}
/**
* 队列是否为空
*/
bool IsQueueEmpty(SqQueue *queue) {
return queue->front == queue->rear;
}
/**
* 入队
*/
bool EnQueue(SqQueue *queue, int elem) {
if ((queue->rear + 1) % queue->capacity == queue->front) {
// 队列已满,需要扩容
int *new_base = (int *) realloc(queue->base, (queue->capacity + QUEUE_INCREMENT) * sizeof(int));
if (!new_base) {
return false;
}
queue->base = new_base;
queue->capacity += QUEUE_INCREMENT;
}
queue->base[queue->rear] = elem;
queue->rear = (queue->rear + 1) % queue->capacity;
queue->size++;
return true;
}
/**
* 出队
*/
bool DeQueue(SqQueue *queue, int *elem) {
if (IsQueueEmpty(queue)) {
return false;
}
*elem = queue->base[queue->front];
queue->front = (queue->front + 1) % queue->capacity;
queue->size--;
return true;
}
/**
* 销毁队列
*/
void DestroyQueue(SqQueue *queue) {
free(queue->base);
queue->base = NULL;
queue->front = queue->rear = queue->size = queue->capacity = 0;
}
```
希望对您有帮助。
阅读全文