循环队列实现一个缓存C语言
时间: 2024-10-14 10:15:35 浏览: 33
循环队列是一种特殊的线性表结构,它通过将队列的头部和尾部链接在一起形成了一个圆环,使得插入和删除操作可以在队列的一端进行,而不会因为满或空而导致数据丢失。在实现一个简单的循环队列作为缓存(LRU Cache,最近最少使用)时,我们需要考虑以下几个关键部分:
1. **定义结构体**:
```c
typedef struct {
int capacity; // 队列最大容量
int front; // 队头指针
int rear; // 队尾指针
int count; // 当前元素个数
int* cache; // 存放数据的数组
} LRUCache;
```
2. **初始化**:
```c
LRUCache* createLRU(int capacity) {
LRUCache* cache = (LRUCache*)malloc(sizeof(LRUCache));
cache->capacity = capacity;
cache->front = -1;
cache->rear = -1;
cache->count = 0;
cache->cache = (int*)malloc(capacity * sizeof(int));
return cache;
}
```
3. **入队操作**(当添加新元素时,替换最久未使用的元素):
```c
void enqueue(LRUCache* cache, int key, int value) {
if (cache->count == cache->capacity) {
int removed_key = cache->cache[cache->front]; // 移除最久未访问的元素
// ... 这里可以记录移除时间或位置等信息
cache->front = (cache->front + 1) % cache->capacity; // 更新队头
}
cache->cache[cache->rear] = key; // 插入新元素
cache->cache[cache->front] = value; // 如果队首也是新元素,则更新队首值
cache->rear = (cache->rear + 1) % cache->capacity; // 更新队尾
cache->count++;
}
```
4. **出队操作**(返回并删除最常用元素):
```c
int dequeue(LRUCache* cache, int key) {
if (cache->count == 0) return -1; // 队列为空
int target_key = cache->cache[cache->front];
if (key == target_key) {
// ... 更新删除时间或位置
int removed_key = cache->cache[cache->front];
cache->front = (cache->front + 1) % cache->capacity;
cache->count--;
return removed_key;
} else {
// 没有找到指定key,遍历查找
for (int i = cache->front + 1; i != cache->rear; i = (i + 1) % cache->capacity) {
if (cache->cache[i] == key) {
// ... 更新删除时间和位置
int removed_key = cache->cache[i];
swap(cache->cache[i], cache->cache[cache->rear]); // 将要删除的元素移动到队尾
cache->rear = (cache->rear + 1) % cache->capacity;
cache->count--;
return removed_key;
}
}
return -1; // 未找到
}
}
```
5. **其他辅助函数**(如交换两个元素、释放内存等)
阅读全文