Created
December 2, 2020 18:26
-
-
Save bhrigu123/af96d2f734705ebbd8e050f190d01f17 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <map> | |
using namespace std; | |
class Node { | |
public: | |
int key, value; | |
Node *prev, *next; | |
Node(int k, int v): key(k), value(v), prev(NULL), next(NULL) {} | |
}; | |
class DoublyLinkedList { | |
Node *front, *rear; | |
bool isEmpty() { | |
return rear == NULL; | |
} | |
public: | |
DoublyLinkedList(): front(NULL), rear(NULL) {} | |
Node* add_page_to_head(int key, int value) { | |
Node *page = new Node(key, value); | |
if(!front && !rear) { | |
front = rear = page; | |
} | |
else { | |
page->next = front; | |
front->prev = page; | |
front = page; | |
} | |
return page; | |
} | |
void move_page_to_head(Node *page) { | |
if(page==front) { | |
return; | |
} | |
if(page == rear) { | |
rear = rear->prev; | |
rear->next = NULL; | |
} | |
else { | |
page->prev->next = page->next; | |
page->next->prev = page->prev; | |
} | |
page->next = front; | |
page->prev = NULL; | |
front->prev = page; | |
front = page; | |
} | |
void remove_rear_page() { | |
if(isEmpty()) { | |
return; | |
} | |
if(front == rear) { | |
delete rear; | |
front = rear = NULL; | |
} | |
else { | |
Node *temp = rear; | |
rear = rear->prev; | |
rear->next = NULL; | |
delete temp; | |
} | |
} | |
Node* get_rear_page() { | |
return rear; | |
} | |
}; | |
class LRUCache{ | |
int capacity, size; | |
DoublyLinkedList *pageList; | |
map<int, Node*> pageMap; | |
public: | |
LRUCache(int capacity) { | |
this->capacity = capacity; | |
size = 0; | |
pageList = new DoublyLinkedList(); | |
pageMap = map<int, Node*>(); | |
} | |
int get(int key) { | |
if(pageMap.find(key)==pageMap.end()) { | |
return -1; | |
} | |
int val = pageMap[key]->value; | |
// move the page to front | |
pageList->move_page_to_head(pageMap[key]); | |
return val; | |
} | |
void put(int key, int value) { | |
if(pageMap.find(key)!=pageMap.end()) { | |
// if key already present, update value and move page to head | |
pageMap[key]->value = value; | |
pageList->move_page_to_head(pageMap[key]); | |
return; | |
} | |
if(size == capacity) { | |
// remove rear page | |
int k = pageList->get_rear_page()->key; | |
pageMap.erase(k); | |
pageList->remove_rear_page(); | |
size--; | |
} | |
// add new page to head to Queue | |
Node *page = pageList->add_page_to_head(key, value); | |
size++; | |
pageMap[key] = page; | |
} | |
~LRUCache() { | |
map<int, Node*>::iterator i1; | |
for(i1=pageMap.begin();i1!=pageMap.end();i1++) { | |
delete i1->second; | |
} | |
delete pageList; | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment