146. LRU Cache


// Acception of mine Jacob
typedef struct my_val my_val_t;
struct my_val {
int key;
int val;
my_val_t* pre;
my_val_t* next;
my_val(int v) { val = v;pre = NULL; next = NULL; };
my_val(int key, int v) { key = key;val = v;pre = NULL; next = NULL; };
};


class LRUCache {
public:
LRUCache(int capacity) {
m_capacity = capacity;
m_node = (my_val_t*)malloc(sizeof(my_val_t));
m_node->pre = m_node;
m_node->next = m_node;
}


int get(int key) {
if (m_data.count(key))
{
my_val_t* p = m_data[key];
int ans = p->val;


getoffNode(p);
insertNodeTofirst(p);


return ans;
}
else
{
return -1;
}
}


void put(int key, int value) {
//set
if (m_data.count(key))
{
my_val_t* p = m_data[key];
p->val = value;


getoffNode(p);
insertNodeTofirst(p);


}
//insert
else
{
my_val_t* p = (my_val_t*)malloc(sizeof(my_val_t));
p->val = value;
p->key = key;


if (m_data.size() >= m_capacity)
{
//delete the last node
my_val_t* qLast = m_node->pre;
getoffNode(qLast);


int key = qLast->key;
m_data.erase(key);

free(qLast);
qLast->pre = NULL;
qLast->next = NULL;
qLast = NULL;

//insert the new node to the first                
insertNodeTofirst(p);
}
else
{
//insert the new node to the first double queue
insertNodeTofirst(p);
}


// insert into map
m_data[key] = p;


}
};


private:


void getoffNode(my_val_t* p)
{
p->pre->next = p->next;
p->next->pre = p->pre;
};
void insertNodeTofirst(my_val_t* p)
{
p->next = m_node->next;
m_node->next->pre = p;
m_node->next = p;
p->pre = m_node;
}
map<int, my_val_t*> m_data;
my_val_t* m_node;
int         m_capacity;
};

猜你喜欢

转载自blog.csdn.net/bjzhaoxiao/article/details/80177480