package com.dataStructure.LRU;
/**
* Created by wang on 2017/3/27.
*/
public class LRUPageFrame {
private static class Node {
Node prev;
Node next;
int pageNum;
Node(int pageNum) {
this.pageNum = pageNum;
}
}
private int capacity;
private int size;
private Node first;// 链表头
private Node last;// 链表尾
public LRUPageFrame(int capacity) {
this.capacity = capacity;
}
public boolean contains(int pageNum){
Node cur = first;
while(cur != null){
if(pageNum == cur.pageNum){
return true;
}
cur = cur.next;
}
return false;
}
public boolean isFull(){
if(size==capacity){
return true;
}
return false;
}
private void isLegal(int pageNum){
if(pageNum<0){
throw new IllegalArgumentException();
}
}
/**
* 获取缓存中对象
*
* @param
* @return
*/
public void access(int pageNum) {
isLegal(pageNum);
if(isFull()){
if(contains(pageNum)){
advance(pageNum);
}else{
removeLast();
addFirst(pageNum);
}
}else{
if(contains(pageNum)){
advance(pageNum);
}else{
add(pageNum);
}
}
}
/**
* 填充页面
* @param pageNum
*/
private void add(int pageNum) {
if(isEmpty()){
Node node = new Node(pageNum);
first = node;
last = node;
size++;
}else{
Node node = new Node(pageNum);
Node oldfirst = first;
node.next = oldfirst;
oldfirst.prev = node;
first = node;
size++;
}
}
private boolean isEmpty() {
return size==0;
}
private void advance(int pageNum) {
if(pageNum==first.pageNum){
}else{
if(pageNum==last.pageNum){
removeLast();
addFirst(pageNum);
}else{
Node x = findNode(pageNum);
exchNum(x);
}
}
}
private void exchNum(Node x) {
int temp = first.pageNum;
first.pageNum = x.pageNum;
x.pageNum = temp;
}
private Node findNode(int pageNum) {
Node cur = first;
while(cur != null){
if(pageNum == cur.pageNum){
break;
}
cur = cur.next;
}
return cur;
}
private void addFirst(int pageNum) {
Node oldFirst = first;
Node newFirst = new Node(pageNum);
oldFirst.prev = newFirst;
newFirst.next = oldFirst;
first = newFirst;
size++;
}
private void removeLast() {
last = last.prev;
last.next = null;
size--;
}
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();
}
}