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

 //stack.h

 typedef struct{
int List[MaxSize];
int top;
}Ustack; void iniStack(Ustack *s)
{
int i;
for(i=;i<MaxSize;i++)s->List [i]=-;
s->top =;
} int isFull(Ustack s)
{
if(s.top==MaxSize)return ; //已满,返回1
else return ; //未满,返回0
} int notEmpty(Ustack s)
{
if(s.top ==)return ; //空,返回0
else return ; //非空,返回1;
} int pushElm(Ustack *s,int x)//元素入栈,将x压入s栈顶。
{
if( isFull(*s) )return ;//如果栈已慢,则压栈失败。
else s->List[s->top++]=x;
return ; //压栈成功。
} int deleteElm(Ustack *s,int site)
{ int i;
if( notEmpty(*s) ) //如果栈非空,则可以删除元素
{
for(i=site;i< s->top-;i++)
s->List[i]=s->List[i+];
s->top--;
s->List[s->top]=-;
return ; //删除第site位置元素成功。
}
return ; //栈已空,删除元素失败。
} int isInStack(Ustack s,int x)
{ int i;
for(i=;i<s.top-;i++)
if(s.List[i]==x)return i; //如果栈中有x,返回x的位置
return -; //如果栈中没有x,返回-1;
} //栈是否非空,无关紧要。 void stackPrt(Ustack s) //打印栈的状态。
{ int i;
for(i=;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=;
int test[];
Ustack mystack;
iniStack(&mystack);
printf("输入序列元素数目:");
scanf("%d",&n);
printf("输入含有%d个页面的序列:",n);
for(i=;i<n;i++){
scanf("%d",&x);
test[i]=x;
}
printf("\n_____栈状态_____访问页号__累计换页次数\n"); for(i=;i<n;i++){
site=isInStack(mystack,test[i]);
if(site==-&&isFull(mystack)){site=;count++;}
if(site!=-)deleteElm(&mystack,site);
pushElm(&mystack,test[i]);
stackPrt(mystack);
printf(" %d",test[i]);
printf(" %d\n",count);
}
}

最新文章

  1. Fibonacci(斐波那契)递归实现。容易看懂
  2. python关键字,运算符
  3. hadoop生态系统的详细介绍
  4. C++利用注册表添加桌面右键新建菜单
  5. Codeforces Round #216 (Div. 2)解题报告
  6. The C in C++
  7. java学习笔记(12) —— Struts2 通过 xml /json 实现简单的业务处理
  8. 802.11(wi-fi)的PHY层(编码与调制方法)
  9. SuperMapPy 批量拼接 GeoTiff影像
  10. java中 try catch finally和return联合使用时,代码执行顺序的小细节
  11. 异常:android.os.NetworkOnMainThreadException
  12. python实现链表(二)
  13. RFC-TCP
  14. Node.js学习准备篇
  15. 如何使用react-redux——傻瓜版
  16. iOS网络篇
  17. VMware虚拟机将英文改成中文的方法
  18. ios-根据单元格里的控件tag值,在方法外获得对应的section与row的值
  19. CentOS 7 firewalld vsftpd开放端口
  20. wamp添加本地虚拟域名

热门文章

  1. 转:spring mvc model.addAttribute页面c:forEach取不到
  2. Ken Norton和软件工程师打交道的10个秘诀
  3. Java笔试题二:读程序
  4. Ubuntu下全命令行安装Android SDK
  5. javaee后台适合用的编辑器插件
  6. MVC使用Exception过滤器自定义处理Action的的异常
  7. iOS中使用正则表达式去掉HTML中的标签元素获得纯文本的方法
  8. nodejs概论(实操篇)
  9. java记事本
  10. 你好,C++(10)这次的C++考试你过了没有?C++中表示逻辑判断的布尔数据类型