lru算法把在固定大小内存的近期最少的数据删除

/*
请求页式存储管理的页面置换算法----lru算法:LRU是Least Recently Used 近期最少使用算法
使用上面的算法把在固定大小内存的近期最少的数据删除。


/*
输出结果

请输入  set如set key value.   get如get key.    look查看每个key的新鲜度吗,越小越新鲜。    quit退出
set key1 value1

请输入  set如set key value.   get如get key.    look查看每个key的新鲜度吗,越小越新鲜。    quit退出
set key2 value2

请输入  set如set key value.   get如get key.    look查看每个key的新鲜度吗,越小越新鲜。    quit退出
look
2 1 0 0
请输入  set如set key value.   get如get key.    look查看每个key的新鲜度吗,越小越新鲜。    quit退出
get key1
value1

请输入  set如set key value.   get如get key.    look查看每个key的新鲜度吗,越小越新鲜。    quit退出
set key3 value3

请输入  set如set key value.   get如get key.    look查看每个key的新鲜度吗,越小越新鲜。    quit退出

set key4 value4

请输入  set如set key value.   get如get key.    look查看每个key的新鲜度吗,越小越新鲜。    quit退出
set key5 value5

请输入  set如set key value.   get如get key.    look查看每个key的新鲜度吗,越小越新鲜。    quit退出
look
4 1 3 2
请输入  set如set key value.   get如get key.    look查看每个key的新鲜度吗,越小越新鲜。    quit退出
set key1
noe

请输入  set如set key value.   get如get key.    look查看每个key的新鲜度吗,越小越新鲜。    quit退出
get key1
noe

请输入  set如set key value.   get如get key.    look查看每个key的新鲜度吗,越小越新鲜。    quit退出
look
1 3 5 4
请输入  set如set key value.   get如get key.    look查看每个key的新鲜度吗,越小越新鲜。    quit退出


*/

#include<conio.h> 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define wulisize 4    //物理块大小


typedef struct page 
{ 
       char key[10];  /*记录页面号*/ 
       char value[20];
       int time;  /*记录调入内存时间*/ 
}Page;                   /* 页面逻辑结构,结构为方便算法实现设计*/ 


Page b[wulisize];            /*内存单元数*/ 

void Init() 
{ 
       int i; 
       for(i=0;i<wulisize;i++) 
              b[i].time=0; 
   
} 

int searchjinc(char *i)//有无相同key
{
  for(int j = 0; j < wulisize; j++)
       if(strcmp(b[j].key,i)==0)
       return j;


  return -1;
}
int searchwu(){//有无空闲区
  for(int j=0; j<wulisize; j++)
    if(b[j].time == 0)
        return j;     
  return -1;
}
int getmax() //获取最大的time号区
{ 
       int i; 
       int max=-1;
       int tag=0;
       for(i=0;i<wulisize;i++) 
       { 
              if(b[i].time>max) 
              { 
                     max=b[i].time; 
                     tag=i; 
              } 
       } 
       return tag; 
}
void empty()
{
  Init();
}
void LRU(char *key,char *value)
{  


  int m,n;//n表示有无相同key在,m表示是否有物理空闲区域
  int v;//更换区号


      
       n=searchjinc(key);
       if (n != -1)//有相同key
       {
        b[n].time=1;
      strcpy(b[n].value,value);


       }
       else //无相同key
         {
             m=searchwu();
             if (m != -1)//有空闲
             {
              b[m].time=1;
              strcpy(b[m].key,key);
          strcpy(b[m].value,value);


             }
             else//无空闲
             {
              v=getmax();
              b[v].time=1;
              strcpy(b[v].key,key);
          strcpy(b[v].value,value);
             }
          }




}
void timego(){
  for (int hang = 0; hang < wulisize; ++hang)
   if(b[hang].time != 0)b[hang].time++;//时间+1;
}


void set()
{ 
  timego();
  char key[10],value[20];
  scanf("%s %s",&key,&value);
  LRU(key,value);
 
}
void getvalue()
{
  char key[10];
  scanf("%s",&key);
  int hang;
      for ( hang = 0; hang < wulisize; ++hang)
        if(0 ==  strcmp(b[hang].key,key))
          {
             printf("%s\n", b[hang].value);


            timego();
            b[hang].time=1;
            break; 


          }
  if (hang == wulisize)
      printf("no key to value");


 
}

void look(){
  for (int hang = 0; hang < wulisize; ++hang)
   printf("%d ",b[hang].time);//时间+1;
}


void main()
{
int sel ;
char caozuo[10];
  Init();
     do{
      printf("请输入  set如set key value.   get如get key.    look查看每个key的新鲜度吗,越小越新鲜。    quit退出");
         scanf("%s",&caozuo);
         if (strcmp(caozuo,"set")==0)
            sel=1;
         else if (strcmp(caozuo,"get")==0)
            sel=2;
        else if (strcmp(caozuo,"look")==0)
            sel=3;
        else if (strcmp(caozuo,"quit")==0)
            sel=0;
        else sel=-1;






         switch(sel)
        {
          case 0:printf("\t\t\t^-^再见!^-^ \t\t\t\n");system("pause");break;
          case 1:set();printf("\n");break;
          case 2:getvalue();printf("\n");break;
          case 3:look();printf("\n");break;
          default: printf("请输入正确的选项号!");printf("\n\n");break;
        }
    }while(sel!=0);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫云的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值