LRU 算法简单实现
在学习很多服务器软件中,当内存不够,而需要淘汰内存的时候,一般会使用LRU算法,便产生了浓厚的兴趣。在学习操作系统的过程中发现LRU在系统中用寄存器和栈来实现。所以我就尝试着学习用栈来解决LRU的问题。当然也参考了别人的代码。
1 //stack.h 2 3 typedef struct{ 4 int List[MaxSize]; 5 int top; 6 }Ustack; 7 8 void iniStack(Ustack *s) 9 { 10 int i; 11 for(i=0;i<MaxSize;i++)s->List [i]=-1; 12 s->top =0; 13 } 14 15 int isFull(Ustack s) 16 { 17 if(s.top==MaxSize)return 1; //已满,返回1 18 else return 0; //未满,返回0 19 } 20 21 int notEmpty(Ustack s) 22 { 23 if(s.top ==0)return 0; //空,返回0 24 else return 1; //非空,返回1; 25 } 26 27 28 int pushElm(Ustack *s,int x)//元素入栈,将x压入s栈顶。 29 { 30 if( isFull(*s) )return 0;//如果栈已慢,则压栈失败。 31 else s->List[s->top++]=x; 32 return 1; //压栈成功。 33 } 34 35 int deleteElm(Ustack *s,int site) 36 { int i; 37 if( notEmpty(*s) ) //如果栈非空,则可以删除元素 38 { 39 for(i=site;i< s->top-1;i++) 40 s->List[i]=s->List[i+1]; 41 s->top--; 42 s->List[s->top]=-1; 43 return 1; //删除第site位置元素成功。 44 } 45 return 0; //栈已空,删除元素失败。 46 } 47 48 int isInStack(Ustack s,int x) 49 { int i; 50 for(i=0;i<s.top-1;i++) 51 if(s.List[i]==x)return i; //如果栈中有x,返回x的位置 52 return -1; //如果栈中没有x,返回-1; 53 } //栈是否非空,无关紧要。 54 55 void stackPrt(Ustack s) //打印栈的状态。 56 { int i; 57 for(i=0;i<s.top;i++) 58 printf("%3d",s.List[i]); 59 for(i=s.top;i<MaxSize;i++) //栈的空位置用“*”代替输出。 60 printf(" *"); 61 62 }
mainlru.cpp
1 #define MaxSize 5 2 #include<stdio.h> 3 #include"stack.h" 4 5 void main() 6 { 7 int i,n,x,site,count=0; 8 int test[30]; 9 Ustack mystack; 10 iniStack(&mystack); 11 printf("输入序列元素数目:"); 12 scanf("%d",&n); 13 printf("输入含有%d个页面的序列:",n); 14 for(i=0;i<n;i++){ 15 scanf("%d",&x); 16 test[i]=x; 17 } 18 printf("\n_____栈状态_____访问页号__累计换页次数\n"); 19 20 for(i=0;i<n;i++){ 21 site=isInStack(mystack,test[i]); 22 if(site==-1&&isFull(mystack)){site=0;count++;} 23 if(site!=-1)deleteElm(&mystack,site); 24 pushElm(&mystack,test[i]); 25 stackPrt(mystack); 26 printf(" %d",test[i]); 27 printf(" %d\n",count); 28 } 29 }