package basic.dataStructure.linkedList;
/**
* @author : 温友朝
*/
public class LRUPageFrame {
private static class Node {
Node prev;
Node next;
int pageNum;
Node() {}
Node(Node prev, Node next, int pageNum){
this.prev = prev;
this.next = next;
this.pageNum = pageNum;
}
}
private int capacity;
private int currentSize;
private Node first;// 链表头
private Node last;// 链表尾
public LRUPageFrame(int capacity) {
this.currentSize = 0;
this.capacity = capacity;
}
/**
* 获取缓存中对象
*
* @param pageNum
*/
public void access(int pageNum){
if(first == null){
last = first = new Node(null, null, pageNum);
this.currentSize++;
return;
}
if(first.pageNum == pageNum){
return;
}
if(currentSize < capacity){
addToFirst(pageNum);
this.currentSize ++;
}else{
//遍历
boolean flag = false;
for(int i = 0; i < capacity; i++){
if(get(i) == pageNum){
flag = true;
break;
}
}
//有相同的,交换该数据至栈顶
if(flag){
this.moveToFirst(pageNum);
}else{
//没有相同的,移除栈底元素
removeLast();
//添加
addToFirst(pageNum);
}
}
}
/**
* 新增至栈底
* @param pageNum
*/
private void addToLast(int pageNum){
Node node = new Node(last, null, pageNum);
last.next = node;
this.last = node;
this.currentSize++;
}
/**
* 新增值栈顶
* @param pageNum
*/
private void addToFirst(int pageNum){
Node node = new Node(null, first, pageNum);
first.prev = node;
this.first = node;
this.currentSize++;
}
/**
* 移除栈底的元素
*/
public void removeLast(){
Node node = last.prev;
node.next = null;
this.last = node;
this.currentSize--;
}
/**
* 从栈底数起,取数
*/
public int get(int index){
int in = 0;
Node temp = last;
int res = -1;
while (temp != null){
if(index == in){
res = temp.pageNum;
}
in++;
temp = temp.prev;
}
return res;
}
public void moveToFirst(int pageNum){
Node temp = last;
while (temp != null){
if(temp.pageNum == pageNum){
break;
}
temp = temp.prev;
}
//处理节点,任意位置时重组链接
if(temp.next != null){
temp.prev.next = temp.next;
temp.next.prev = temp.prev;
}else{
//栈底remove调
removeLast();
}
addToFirst(pageNum);
}
public int size(){
return this.currentSize;
}
public String toString(){
StringBuilder buffer = new StringBuilder();
Node node = first;
while(node != null){
buffer.append(node.pageNum);
node = node.next;
if(node != null){
buffer.append(",");
}
}
return buffer.toString();
}
}