#include <stdio.h>
#include <stdlib.h>
#define N 100
int s[N]; //页面访问序列:
int t; // 内存块个数
int h; // 总个数
int f = 0;
char c;
int cmp(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
void OPT() // 永久不使用 , 最长时间不使用
{
printf("输入页面访问序列:");
while (c != '\n')
{
scanf("%d%c", &s[f++],&c);
h++;
}
printf("进程分配的内存块数:");
scanf("%d", &t);
int a[N];
int k = 0,l = t;
int g;
int x=0;
int count = 0;
int hx[N];
for(int i = 0 ; i < t ; i++)
{
a[i] = s[i];
}
for(int i = 0 ; i < t ; i++)
{
printf("%d ",a[i]);
}
printf("\n");
while(l<h)
{
g = s[l]; // 保存要插入的值
k = 0 ;
for(int i = 0 ;i < N ; i++)
hx[i] = 0 ;
for(int i = 0 ; i < t ; i++ ) //查找要插入的值 是否重复
{
if(a[i] == s[l])
{
k = 1;
break;
}
}
if(k)
{
printf("%d为相同元素转到下一个元素\n",g);
l++;
}
else{
int sum = 0; // 求和记录
printf("%d是新元素置换开始\n",g);
count++;
int u = l+1;
int j=u;
for(int i = 0 ; i < t ,j < h; i++)
{
if(a[i] == s[j] && hx[a[i]]==0)
{
hx[a[i]] = 1;
sum+=1;
j++;
i = -1;
}
else if(i+1 == t) // 新元素跳过
{
i = -1;
j++;
}
else if(sum == t-1) //结束查找
break;
}
for(int i = 0 ;i < t ; i++)
if( hx[a[i]] == 0)
{
a[i] = g;
}
l++;
}
if(x < count)
{
printf("第%d次置换后的结果:\n",count);
for(int i = 0 ; i < t ; i++)
printf("%d ",a[i]);
printf("\n");
x++;
}
}
double r = count*0.1/(h-1);
printf("%0.2f",r);
}
void FIFO()
{
printf("输入页面访问序列:");
while (c != '\n')
{
scanf("%d%c", &s[f++],&c);
h++;
}
printf("进程分配的内存块数:");
scanf("%d", &t);
int a[N];
int l = t;
int k = 0;
int g;
int count=0;
int p = 0;
int x = 0;
for(int i = 0 ; i < t ; i++)
{
a[i] = s[i];
}
while(l < h)
{
k=0;
g = s[l];
for(int i = 0; i < t; i++ )
{
if(a[i] == s[l])
{
k = 1;
break;
}
}
if(k)
{
printf("%d为相同元素转到下一个元素\n",g);
l++;
}
else{
printf("%d是新元素置换开始\n",g);
count++;
a[p++] = s[l++];
if(p == 3)
p = 0;
}
if(x < count)
{
printf("第%d次置换后的结果:\n",count);
for(int i = 0 ; i < t ; i++)
printf("%d ",a[i]);
printf("\n");
x++;
}
}
double r = count*0.1/h;
printf("\n%0.2f",r);
}
void LRU()
{
printf("输入页面访问序列:");
while (c != '\n')
{
scanf("%d%c", &s[f++],&c);
h++;
}
printf("进程分配的内存块数:");
scanf("%d", &t);
int a[N];
int l = t;
int k = 0;
int x = 0;
int hx[t]; //记录要插入的的位置
int count = 0 ;
int g;
int b[N];
int z[N];
int u=0;
int m =0;
for(int i = 0; i < h ; i++)
b[i] = s[i];
for(int i = 0 ;i < h ;i++) //数组去重复
{
u=0;
for(int j = 0 ; j < m ; j++)
{
if(b[i] == z[j])
{
u=1;
break;
}
}
if(!u){
z[m++] = b[i];
}
}
for(int i = 0; i < t ; i++)
{
a[i] = z[i];
hx[a[i]] = i+1;
}
while(l<h)
{
k=0;
g = s[l];
for(int i = 0 ; i < t ; i++)
if(a[i] == s[l])
{
for(int j = 0 ; j < t ; j++)
if(hx[a[j]]!=1)
hx[a[j]] = hx[a[j]] - 1;
hx[a[i]] = t;
k = 1;
break;
}
if(k)
{
printf("%d为相同元素转到下一个元素\n",g);
l++;
}
else
{
printf("%d是新元素置换开始\n",g);
count++;
for(int i = 0 ; i < t ; i++)
{
if(hx[a[i]] == 1)
{
for(int j = 0 ; j < t ; j++)
hx[a[j]] = hx[a[j]] - 1;
a[i] = g ;
hx[a[i]] = t;
break;
}
}
l++;
}
if(x < count)
{
printf("第%d次置换后的结果:\n",count);
for(int i = 0 ; i < t ; i++)
printf("%d ",a[i]);
printf("\n");
x++;
}
}
double r = count*0.1/h;
printf("\n%0.2f",r);
}
int main()
{
int n;
printf("请选择要执行的操作:\n1:最佳置换算法\n2:先进先出算法\n3:最近最久未使用算法\n");
scanf("%d", &n);
switch(n)
{
case 1: OPT(); break;
case 2: FIFO(); break;
case 3: LRU(); break;
}
return 0;
}
05-16
1463
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
01-25
6942
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
12-18
1万+
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交