您的位置:首页 > 其它

LRU 算法简单实现

2014-09-26 10:08 246 查看
  在学习很多服务器软件中,当内存不够,而需要淘汰内存的时候,一般会使用LRU算法,便产生了浓厚的兴趣。在学习操作系统的过程中发现LRU在系统中用寄存器和栈来实现。所以我就尝试着学习用栈来解决LRU的问题。当然也参考了别人的代码。

//stack.h

typedef struct{
int List[MaxSize];
int top;
}Ustack;

void iniStack(Ustack *s)
{
int i;
for(i=0;i<MaxSize;i++)s->List [i]=-1;
s->top =0;
}

int  isFull(Ustack s)
{
if(s.top==MaxSize)return 1; //已满,返回1
else return 0;                //未满,返回0
}

int notEmpty(Ustack s)
{
if(s.top ==0)return 0;  //空,返回0
else return 1;            //非空,返回1;
}

int  pushElm(Ustack *s,int x)//元素入栈,将x压入s栈顶。
{
if( isFull(*s) )return 0;//如果栈已慢,则压栈失败。
else s->List[s->top++]=x;
return 1;                 //压栈成功。
}

int deleteElm(Ustack *s,int site)
{    int i;
if( notEmpty(*s) )                        //如果栈非空,则可以删除元素
{
for(i=site;i< s->top-1;i++)
s->List[i]=s->List[i+1];
s->top--;
s->List[s->top]=-1;
return 1;                            //删除第site位置元素成功。
}
return 0;                                //栈已空,删除元素失败。
}

int isInStack(Ustack s,int x)
{    int i;
for(i=0;i<s.top-1;i++)
if(s.List[i]==x)return i;    //如果栈中有x,返回x的位置
return -1;                        //如果栈中没有x,返回-1;
}                                    //栈是否非空,无关紧要。

void stackPrt(Ustack s)                //打印栈的状态。
{    int i;
for(i=0;i<s.top;i++)
printf("%3d",s.List[i]);
for(i=s.top;i<MaxSize;i++)        //栈的空位置用“*”代替输出。
printf("  *");

}


mainlru.cpp

#define MaxSize 5
#include<stdio.h>
#include"stack.h"

void main()
{
int i,n,x,site,count=0;
int test[30];
Ustack mystack;
iniStack(&mystack);
printf("输入序列元素数目:");
scanf("%d",&n);
printf("输入含有%d个页面的序列:",n);
for(i=0;i<n;i++){
scanf("%d",&x);
test[i]=x;
}
printf("\n_____栈状态_____访问页号__累计换页次数\n");

for(i=0;i<n;i++){
site=isInStack(mystack,test[i]);
if(site==-1&&isFull(mystack)){site=0;count++;}
if(site!=-1)deleteElm(&mystack,site);
pushElm(&mystack,test[i]);
stackPrt(mystack);
printf("     %d",test[i]);
printf("        %d\n",count);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: