![]()
#! -*- encoding=utf-8 -*-
from DoubleLinkedList import DoubleLinkedList, Node
class FIFOCache(object):
def __init__(self, capacity):
self.capacity = capacity
self.size = 0
self.map = {} # 用map映射的意义:因为自己创建的链表,只是一堆对象,只不过他们的属性首尾相连而已
# 在链表类中,List是一个用来管理Node的类,很难查找到某一个node,所以选择加入一个键值元祖映射链表
# 使用了键值对,用key来映射一个node,node中有(key,value),这样就很容易管理这个list
# 这在python中不是数组,叫做元祖 d = { key1 : value1, key2 : value2 } 储存的就是键值对
self.list = DoubleLinkedList(self.capacity)
def get(self, key): # 值不在缓存中
if key not in self.map:
return -1
else:
node = self.map.get(key)
return node.value
def put(self, key, value):
if self.capacity == 0:
return
if key in self.map: # 如果已经在缓冲中
node = self.map.get(key) # 按键来取值
self.list.remove(node)
node.value = value
self.list.append(node)
else: # 不在缓存中
if self.size == self.capacity: # 缓存容量已满
node = self.list.pop()
del self.map[node.key]
self.size -= 1
node = Node(key, value)
self.list.append(node)
self.map[key] = node # 把key = x 和 value = y 以x:y的形式加入map = {} 元祖的尾部
self.size += 1
def print(self): # 用于查看缓存中的数据,测试使用
self.list.print()
if __name__ == '__main__':
cache = FIFOCache(2)
cache.put(1, 1)
cache.print()
cache.put(2, 2)
cache.print()
print(cache.get(1))
cache.put(3, 3)
cache.print()
print(cache.get(2))
cache.put(4, 4)
cache.print()
print(cache.get(1))