方法一:双链表+哈希表map
#include<iostream>
#include<map>
using namespace std;
struct Node
{
int key;
int value;
Node* pre;
Node* next;
Node(int key=-1,int value=-1):key(key),value(value),pre(NULL),next(NULL){};
};
class Solution
{
private:
int capacity;
Node* head;
Node* tail;
map<int,Node*>cachemp;
public:
Solution(int size=5);
~Solution();
void deletenode(Node* node);
void putfront(Node* node);
int get(int key);
void set(int key,int value);
void display();
void showmap();
};
Solution::Solution(int size)
{
capacity=size;
head=new Node;
tail=new Node;
head->next=tail;
head->pre=NULL;
tail->pre=head;
tail->next=NULL;
}
Solution::~Solution()
{
Node* p;
p=head->next;
while(p)
{
delete(p->pre);
p=p->next;
}
delete(tail);
}
void Solution::putfront(Node* node)
{
node->next=head->next;
head->next=node;
node->next->pre=node;
node->pre=head;
}
void Solution::deletenode(Node* node)
{
if(node==NULL)
return;
node->pre->next=node->next;
node->next->pre=node->pre;
delete(node);
}
int Solution::get(int key)
{
map<int,Node*>::iterator iter=cachemp.find(key);
if(iter==cachemp.end())
{
return -1;
}
else
{
Node* node=new Node(iter->second->key,iter->second->value);
deletenode(iter->second);
cachemp.erase(iter);
putfront(node);
cachemp[key]=node;
return node->value;
}
showmap();
}
void Solution::set(int key,int value)
{
map<int,Node*>::iterator iter=cachemp.find(key);
Node* node=new Node(key,value);
if(iter==cachemp.end())
{
if(cachemp.size()==capacity)
{
cachemp.erase(tail->pre->key);
deletenode(tail->pre);
}
putfront(node);
cachemp[key]=node;
}
else
{
deletenode(iter->second);
putfront(node);
cachemp.erase(iter);
cachemp[key]=head->next;
}
display();
showmap();
}
void Solution::display()
{
Nod