分析:clock置换算法是利用循环队列来实现的。操作系统课本上的讲解时这样的
代码实现:
#include<iostream>
using namespace std;
typedef struct numbernode
{
int *data;
bool *ask;//访问号
}Numnode;
typedef struct node
{
Numnode numnode;
int maxsize;
int rear;
int front;
}queue;
queue* create();
void push(queue *);
void pop(queue *);
int turnyemian(queue *myque,int Telem);
queue* create()
{
queue *myque=new queue;
myque->numnode.data=new int;
myque->numnode.ask=new bool;
myque->rear=0;
myque->front=0;
int i;
int m;
printf("队列共有多少个元素?\n");
scanf("%d",&m);
for(i=0;i<=m;i++)
myque->numnode.ask[i]=false;
myque->maxsize=m+1;
return myque;
}
void push(queue *myque)
{
if((myque->rear+1)%myque->maxsize!=myque->front)
{
printf("请输入您访问的页面号?\n");
scanf("%d",&myque->numnode.data[myque->rear]);
myque->numnode.ask[myque->rear]=true;
myque->rear=(myque->rear+1)%myque->maxsize;
}
else
{
int Telem;
printf("此时队列里面页面数满了,要进行页面置换\n");
printf("您要访问的页面号?\n");
scanf("%d",&Telem);
turnyemian(myque,Telem);
}
}
int turnyemian(queue *myque,int Telem)
{
int key=myque->front;
while(1)
{
if((myque->numnode.ask[key]==true)&&((key+1)%myque->maxsize!=myque->front))
{
myque->numnode.ask[key]=false;
key=(key+1)%myque->maxsize;
}
if((key+1)%myque->maxsize==myque->front)
{
key=(key+1)%myque->maxsize;
}
if(myque->numnode.ask[key]==false)
{
myque->numnode.data[key]=Telem;//用Telem的数值来置换这个页面
myque->numnode.ask[key]=true;
printf("用%d置换了这个页面\n",myque->numnode.data[key]);
return 0;
}
}
}
void pop(queue *myque)
{
if(myque->front!=myque->rear)
{
printf("您删除了循环队列的元素%d",myque->numnode.data[myque->front]);
myque->front=(myque->front+1)%myque->maxsize;
}
else
{
printf("队列空了,不能再删除了");
}
}
void prints(queue *myque)
{
int p=myque->front;
while(p!=myque->rear)
{
if(p==myque->front)
{
printf("%d",myque->numnode.data[p]);
p++;
}
else
{
printf("<- %d",myque->numnode.data[p]);
p++;
}
}
printf("\n");
}
int main(void)
{
queue *myque=new queue;
myque=create();
int key;
while(1)
{
printf("*************请选择如下操作:*************\n");
printf("1.添加元素\n");
printf("2.删除元素\n");
printf("3.显示循环队列\n");
printf("4.退出系统\n");
scanf("%d",&key);
switch (key)
{
case 1:push(myque);break;
case 2:pop(myque);break;
case 3:prints(myque);break;
case 4:return 0;
default:
break;
}
}
return 0;
}
结果展示:
原始的3个页面
第一次页面置换
第二次置换
第三次置换
第四次置换
至此,四次置换完成。