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 }

 

posted @ 2014-09-26 10:08  泪痕湮灭  Views(900)  Comments(0)    收藏  举报