struct CacheNode {
int key;
int value;
CacheNode *pre, *next;
CacheNode(int k, int v) : key(k), value(v), pre(NULL), next(NULL) {}
};
class LRUCache
{
public:
int size;
CacheNode *head,*tail;
map<int, CacheNode* >mp;
public:
LRUCache(int capacity){
size = capacity;
head = nullptr;
tail = nullptr;
}
int get(int key){
if (mp.find(key) != mp.end()){
CacheNode *tmp = mp[key];
remove(tmp);
setHead(tmp);
return tmp->value;
}
else{
return -1;
}
}
void set(int key, int value){
if (mp.find(key) != mp.end()){
CacheNode *tmp = mp[key];
remove(tmp);
setHead(tmp);
tmp->value = value;
}
else{
CacheNode *tmp = new CacheNode(key, value);
if (mp.size() >= size){
remove(tail);
mp.erase(mp.find(tail->key));
}
setHead(tmp);
mp[key] = tmp;//注意插入数据到map里
}
}
void remove(CacheNode *node){
if (node->pre == nullptr){//删的是头结点
head = node->next;//令当前头结点指向下一个节点
}
else{
node->pre->next = node->next;
}
if (node->next == nullptr){//删的是尾结点
tail = node->pre;//令当前尾结点指向上一个节点
}
else{
node->next->pre = node->pre;
}
}
void setHead(CacheNode *node){
node->pre = nullptr;//设置节点为头节点的话,没有前驱节点
node->next = head;//当前节点设置为头节点后,其下一个节点应该是原来的头节点
if (head)
head->pre = node;//如果头节点不为空,则头结点的前驱节点为传进来的结点
head = node;//头节点位置换为传进来的节点
if (!tail)
tail = head;//看尾节点是否为空,为空的话就设置成头结点一样,即只有一个节点的情况下
}
};
C++实现LRU算法
于 2023-03-16 15:36:03 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)