#include<iostream>
using namespace std;
class QNode{ //链队结点的类
int data;
QNode *next;
public:
QNode(int item=100)
{
data= item;
next=NULL;
}
friend class LinkQueue;
}; // QNode
class LinkQueue
{
QNode *front, *rear;
public:
LinkQueue()
{
rear =front=new QNode();
}
void Enter (int item );
int Leave();
int Front();
void Clear ()
{
front->next = rear->next = NULL;
}
bool IsEmpty ()
{
return front->next==NULL;
}
}; // LinkQueue
void LinkQueue::Enter ( int item )
{
rear->next = new QNode ( item);
rear=rear->next;
}//Enter
int LinkQueue::Leave( )
{
QNode *p;
if (!IsEmpty ( ) )
{//判队不空
p = front->next;
int retvalue = p->data; //保存队头的值
front->next = p->next;
delete p;
if ( front->next==NULL ) //删除队列中唯一结点后,重新设置rear
rear=front;
return retvalue;
}
else
{
cout<<" 队列空!"<<endl;
return 100;
}
}//Leave
int LinkQueue::Front( )
{
if ( !IsEmpty ( ) )
return front->next->data;
else
{
cout<<"队列空,无队头元素!"<<endl;
return 100;
}
}//Front
int main()
{
LinkQueue A;
int n;
int length,length1;
int c;
int count=0,count_n=0;
cout<<"请输入页框大小"<<endl;
cin>>n;
cout<<"请输入内存需求序列的长度"<<endl;
cin>>length;
length1=length;
if(n>length1||n==length1)
{
cout<<"此时进程数小于页框的大小,不用进行任何的置换"<<endl;
while(length1)
{
length1--;
cout<<"请输入内存请求块"<<endl;
cin>>c;
A.Enter(c);
}
length1=length;
cout<<"页框内的进程是"<<endl;
while(length1)
{
length1--;
cout<<A.Leave()<<endl;
}
cout<<"页面置换率为0"<<endl;
}
else
{
cout<<"此时进程数大于页框"<<endl;
while(length1)
{
length1--;
if(count_n<n)//页框是否已满
{
cout<<"此时页框还没满,可以进行页框"<<endl;
cout<<"请输入内存请求块"<<endl;
cin>>c;
A.Enter(c);
count_n++;
}
else
{
cout<<"此时页框已经满了,需要进行页面置换"<<endl;
cout<<"请输入内存请求块"<<endl;
cin>>c;
int m=n;
int b;
LinkQueue B;
/检查A队列中是否已存在请求的内存块/
cout<<"检查是不是有相同的"<<endl;
while(m)
{
b=A.Leave();
if(b==c)
{
count++;
}
B.Enter(b);
m--;
}
将A队列恢复
int nn=n;
cout<<"将B队列给A队列"<<endl;
while(nn)
{
A.Enter(B.Leave());
nn--;
}
nn=n;
if(!count)//页框中不存在请求内存块
{
cout<<"c进入A队列"<<endl;
A.Leave();
A.Enter(c);
cout<<"此时页框内的进程为"<<endl;
int d;
LinkQueue C;
while(nn)
{
d=A.Leave();
cout<<d<<endl;
C.Enter(d);
nn--;
}
nn=n;
while(nn)
{
A.Enter(C.Leave());
nn--;
}
}
else
cout<<"页框中已存在该进程,不需要进行置换"<<endl;
}
}
float ha=(length-n-count)/(length*1.0);
cout<<"页面置换率为"<<ha<<endl;
}
return 0;
}