import java.util.LinkedList; import java.util.List; import java.util.Scanner; public class LRU { static int volum;// 栈的容量 static List<Integer>list=new LinkedList<Integer>(); //链表用来模拟栈存放页面 static int[]visit;//要访问的页面数组 static int count=0;//记录缺页次数 public static void main(String []args) { Scanner sc = new Scanner(System.in); System.out.print("请输入栈的容量:"); volum=sc.nextInt(); System.out.print("请输入总页面数目:"); int n=sc.nextInt(); visit=new int[n]; System.out.println("请输入各个页的页面号码:"); for(int i=0;i<n;i++) visit[i]=sc.nextInt(); sLRU();//调用最近最久未使用算法 System.out.println("置换页面的数目为:"+count); } public static void sLRU() { int index=0; while(index<visit.length) { boolean flag=false; if(list.size()<=volum) { for(int i=0;i<list.size();i++) { if((int)(list.get(i))==visit[index]) { list.remove(i);//先删除 list.add(visit[index]);//再添加到尾部 flag=true; break; } } if(!flag) { if(list.size()<volum) {//如果栈未满,而且此页面没有在栈中,就将它入栈 list.add(visit[index]); } else {//如果栈已经满了,且该页面号码没有在栈中,就把栈底元素删除,将新页插入 int temp=list.get(0); list.remove(0);//最开始一个换出 list.add(visit[index]);//加到末尾 count++; System.out.println("开始换页了,将栈底的"+temp+"换出"); System.out.println("这也是没有办法的事情,毕竟栈是有限的"); } } System.out.print("经过第"+(index+1)+"个页面的栈内容为"); for(int k=0;k<list.size();k++) System.out.print(list.get(k)+" "); System.out.println(); index++; } } } }