import java.util.Scanner;
import java.util.Random;
class Node {
Node next; //头指针
Node pre; //尾指针
int data;//数据域
Node( int data) {
this. data = data;
}
//显示此节点
void display() {
System. out.print( data + " ");
}
}
//链队列
class LinkQueue {
Node first; // 定义一个头结点
Node last; //定义一个尾节点
int length;// 队列长度
LinkQueue() { //初始化
this. first = null;
this.last=null;
length=0;
}
// 进队
void come( int data) {
if(length==0){
Node node = new Node(data);
node.pre=null;
node.next=null;
first=node;
last= node;
length++;
}
else{
Node node = new Node(data);
node.pre=last;
node.next=null;
last.next=node;
last=node;
length++;
}
}
// 出队
void out() {
first = first. next;
first.pre=null;
length--;
}
// 根据节点的data删除节点(从队尾到队头,仅仅删除第一个)
boolean deleteData( int data) {
Node current = last;
Node previous;
if(first == null || last==null)
return false;
while (current. data != data) {
if (current. pre == null) {
return false;
}
current=current.pre;
}
if(current == last) {
last= last. pre;
last.next=null;
length--;
}
else if(current.pre==null){
previous=current. next ;
previous.pre=null;
this.first=previous;
length--;
}
else{
previous=current. pre;
previous.next=current.next;
current=current.next;
current.pre=previous;
length--;
}
return true;
}
// 从队头显示出所有的节点信息
void displayF() {
Node current = first;
while (current != null) {
current.display();
current = current. next;
}
System. out.println();
}
//从队尾显示出所有的节点信息
void displayL() {
Node current = last;
while (current != null) {
current.display();
current = current. pre;
}
System. out.println();
}
}
public class aaaa {
public static void main(String[] args) {
/* LinkQueue linkqueue = new LinkQueue();
Scanner reader=new Scanner(System.in);
int input=reader.nextInt();
while(input!=233){
linkqueue.addFirstNode(input);
input=reader.nextInt();
}
linkqueue.displayAllNodes();
linkqueue.deleteByData(4);
linkqueue.displayAllNodes();
linkqueue.displayallNodes(); */
int order=8; //指令数
int [] c=new int[order]; //地址访问顺序
int [] b=new int[order]; //页面访问顺序
int memory=4; //内存容量
int lose=0; //页面失效次数
double hit_rate=0; //命中率
int i,j,k;
int count1=0;
int count2=0;
int m1,m2,m3;
Random rand = new Random();
/
System.out.println("产生的随机数为:");
for(i=0;;i++){
m1=rand.nextInt(320); //在0--319之间随机产生一个数
c[count1]=m1+1;
System.out.print(c[count1]+" ");
count1++;
count2++;
if(count1==order)
break;
if(count2==32){
System.out.print("\n");
count2=0;
}
m2=rand.nextInt(m1+1); //在0--m1+1之间随机产生一个数
c[count1]=m2+1;
System.out.print(c[count1]+" ");
count1++;
count2++;
if(count1==order)
break;
if(count2==32){
System.out.print("\n");
count2=0;
}
m3=rand.nextInt(320-m2-2)+m2+2; //在m2+2--319之间随机产生一个数
c[count1]=m3+1;
System.out.print(c[count1]+" ");
count1++;
count2++;
if(count1==order)
break;
if(count2==32){
System.out.print("\n");
count2=0;
}
}
System.out.print("\n");
///
System.out.println("访问页面的顺序为:");
count2=0;
for(i=0;i<order;i++){
b[i]=c[i]/10;
System.out.print(b[i]+" ");
count2++;
if(count2==32){
System.out.print("\n");
count2=0;
}
}
System.out.print("\n");
///
// for(memory=4;memory<=32;memory++){
System.out.println("页面进入内存的步骤为:");
LinkQueue queue=new LinkQueue();
for(i=0;i<order;i++){
if(queue.length==memory){ //如果内存满了,就淘汰最早进入内存的页面,否则直接进入内存
if(queue.deleteData(b[i])==false) { //如果没有命中,缺页次数加一,更新一次队列,否则淘汰最早进入内存的页面
lose++;
queue.out();
queue.come(b[i]);
}
else{
queue.come(b[i]);
}
}
else{
if(queue.deleteData(b[i])==false) //如果没有命中,缺页次数加一,更新一次队列
lose++;
queue.come(b[i]);
}
queue.displayF();
}
/
System.out.println("页面失效次数为:"+lose);
hit_rate=1-(lose/320.0);
System.out.println("命中率="+hit_rate);
lose=0;
hit_rate=0;
}
}
页面置换过程太长,这里就不截图了,想看的自己运行一下程序。