#include<bits/stdc++.h>
using namespace std;
class LinkStack{
private:
struct Node{
int elem;
struct Node* next;
struct Node* prev;
};
struct Node* head;
struct Node* tail;
public:
LinkStack(){
head=new struct Node;
tail=new struct Node;
head->next=NULL;
head->prev=NULL;
tail=head;
}
~LinkStack(){}
void push(int k){
struct Node* middle = new struct Node;
middle->elem=k;
tail->next=middle;
middle->prev=tail;
middle->next=NULL;
tail=middle;
}
void pop(){
if(tail==head){
cout<<"the stack is empty";
}
else{
struct Node* middle=new struct Node;
middle=tail;
tail=tail->prev;
tail->next=NULL;
free(middle);
}
}
void del(int k){
struct Node* ser = new struct Node;
ser=head;
while(ser=ser->next){
if(ser->elem==k){
ser->prev->next=ser->next;
ser->next->prev=ser->prev;
tail->next=ser;
ser->prev=tail;
ser->next=NULL;
tail=ser;
break;
}
}
}
bool findlink(int k){
struct Node* ser = new struct Node;
ser=head;
while(ser=ser->next){
if(ser->elem==k){
return true;
}
}
return false;
}
void print_structure(){
struct Node* ser=new struct Node;
ser=tail;
while(ser!=head){
cout<<"+--------------+\n";
cout<<ser->elem<<endl;
cout<<"+--------------+\n";
ser=ser->prev;
}
}
int feedback(int k){
int level=1;
struct Node* ser=new struct Node;
ser=head;
while(ser=ser->next){
if(ser->elem==k){
return level;
}
level++;
}
}
int back_head(){
return head->next->elem;
}
};
int main()
{
int k;LinkStack s;
cout<<"请输入空闲的帧的数目:\n";
int p;cin>>p;int sum=p;
int element[p];
while(1==1){
cout<<"以下输入一个引用串:"<<endl;
cin>>k;
if(p>0){
cout<<"具有空闲帧\n";
int flag=1;
for(int i=0;i<sum-p;i++){
if(element[i]==k){
cout<<"当前引用串已经存在于页帧中,故无需请求调页\n";
flag=0;break;
}
}
if(flag==1){
for(int i=0;i<sum-p;i++){
cout<<element[i]<<endl;
}
element[sum-p]=k;
cout<<k<<endl;
for(int i=sum-p+1;i<sum;i++){
cout<<"空闲"<<endl;
}
p--;
}
}
else if(p==0){
int flag=0;
for(int i=0;i<sum;i++){
if(element[i]==k){
cout<<"该引用已经存在于页帧中,故无需进行页面置换\n";
flag=1;break;
}
}
if(flag==0){
int mind=1e6+10,j=0;
cout<<"没有空闲帧且该引用不存在于当前的页帧中,开始进行页面置换\n";
for(int i=0;i<sum;i++){
if(s.feedback(element[i])<mind){
j=i;mind=s.feedback(element[i]);
}
}
element[j]=k;
for(int i=0;i<sum;i++){
cout<<element[i]<<endl;
}
}
if(!s.findlink(k)){
s.push(k);
}
else{
s.del(k);
}
}
}
}