前言:
FIFO:先进先出算法的模拟。若想用链表完成,请参考:http://www.jb51.net/article/55691.htm,使用现成轮子参考:http://www.cnblogs.com/break-python/p/5459169.html
这里我是使用的是纯属List.本人小白,如有错误,请指出,谢谢。
#-*- coding: UTF-8 -*- #author:若鸟,原创 #data:2016-12-21 #function:实现对LRU算法的模拟,针对FIFO的升级,可改变模块数。 ''' 思路:虽说是重复造轮子,但也是锻炼思维 本想FIFO代码的基础上进行升级,但是,遇到一个问题:当对字典进行记录先后顺序时,如果模块数较多,则需要循环,但是不能 够通过循环赋值,绞尽脑汁,干脆另起炉灶,换一种思路。 创建一个列表,用来记录已经输入过得页面,但是这个列表必须按 从晚到早 的顺序排列,而且还必须去掉重复的页面,得到这个列表 而这个列表的第 [ 模块数-1]个索引的值,就是需要替换的值。然后通过遍历序列,找出,替换。 ''' import string def InputList(): #输入函数,输入序列数 list_input=[] input_str=input("请输入序列,并以空格键分隔\n") len_input_str=len(input_str) for i in range(0,len_input_str,2): #去除空格 list_input.append(int(input_str[i])) print("您输入的页面序列是:",list_input) return list_input #返回一个输入的序列 def LRU_Algorithm(list_input=[],size=3): #LRU算法,模块号默认为3 list_new=[] #页面队列 size=int(size) #将输入的模块数转化为int型 for i in range(len(list_input)): #遍历输入的页面队列索引 if i<size: #先将空的模块填满 list_new.append(list_input[i]) print("原列表有空存储块,直接存入{}页面,现在的序列是:{}".format(i,list_new)) elif list_input[i] in list_new: #当输入的页面在原来的队列中 print("不需中断,序列中存在{}页面,现在的序列是:{}".format(i,list_new)) else: #输入的页面不在队列中 q=list_input[:i] #先创建已经输入的队列 q.reverse() #将已经输入的队列倒叙排列 list_input_sort=[] #创建一个新的列表,用于存储去重后的页面序列 for x in q: if x in list_input_sort: #存在在列表中,直接pass pass else: list_input_sort.append(x) #如果不存在,直接加入新的列表 temp=list_input_sort[size-1] #需要被替换的页面 for n in range(len(list_new)): #在页面中替换掉最早输入的页面 if temp==list_new[n]: list_new[n]=list_input[i] print("页面中断,页面{}被{}替换,现在的序列是:{}".format(temp,list_input[i],list_new)) if __name__=='__main__': size=input("请输入存储区域块数:\n") LRU_Algorithm(InputList(),size) s=input("输入任意退出")