package DataStructure_4_LRU; import org.junit.runners.Parameterized.Parameters; /* * ��˫������ʵ��LRU�㷨 */ public class LRUPageFrame { private static class Node{ Node prev; Node next; int pageNum = -1;// ����ҳ Node(){ } } private int capacity; private Node first;// ����ͷ private Node last;// ����β boolean tag = false; public LRUPageFrame(int capacity){ this.capacity = capacity; for(int i = 0; i < capacity; i++){ Node curNode = new Node(); if(null == first){ last = first = curNode; }else{ last.next = curNode; curNode.prev = last; last = last.next; } last.next = null; } } public void printList(){ Node curNode = first; while(curNode != null){ curNode = curNode.next; } } /* * ��ȡ�����ж��� * @param key * @return */ public void access(int pageNum){ printList(); Node index = findLogicPage(pageNum); modifyPhysicalPage(index,pageNum); } /* * @param pageNum ��ʾҪ��ѯ���߼�ҳ�� * @return ��������ҳ���ҵ�Ҫ��ѯ���߼�ҳ�棬�򷵻ظ�����ҳ�ڵ�����ã����򷵻�null */ public Node findLogicPage(int pageNum){ Node index = null; Node curNode = first; while(curNode != null){ if(curNode.pageNum == pageNum){ index = curNode; tag = true; } curNode = curNode.next; } return index; } /* * @prama index ������ ���߼�ҳ������ҳ�Ľڵ������ */ public void modifyPhysicalPage(Node index,int pageNum){ push(pageNum,index); } /* * @param pageNum Ҫ push���߼�ҳ�棬 Ĭ��ջ���� first, bottom ջ�� ָ����ջ�Ĵ�С */ public void push(int pageNum,Node bottom){ Node index = checkWhichListNodeNotUsed(); if(index != null){ index.pageNum = pageNum; return; } Node lastNode; if(null == bottom){ lastNode = last; }else{ lastNode = bottom; } Node curNode = lastNode.prev; while(curNode != null){ lastNode.pageNum = curNode.pageNum; lastNode = curNode; curNode = curNode.prev; } lastNode.pageNum = pageNum; return; } /* * @return ��������ҳ�� pageNum û�б�ʹ�õĽڵ������(����ջ���������)�����ȫ������ʹ�ã��򷵻� null */ public Node checkWhichListNodeNotUsed(){ Node node = first; Node index = null; while(node != null){ if(node.pageNum == -1){ index = node; } node = node.next; } return index; } public String toString(){ StringBuffer buffer = new StringBuffer(); Node node = first; while(node != null){ buffer.append(node.pageNum); node = node.next; if(node != null){ buffer.append(","); } } return buffer.toString(); } }