1、研究有空间限制的栈的原因
当我们使用很多软件时都有类似“undo”功能,比如Web浏览器的回退功能、文本编辑器的撤销编辑功能。这些功能都可以使用Stack实现,但是在现实中浏览器的回退功能也好,编辑器的撤销功能也好,都有一定的数量限制。因此我们需要的不是一个普通的Stack数据结构,而是一个空间有限制的Stack,虽然空间有限,但这样的Stack在入栈时从不会溢出,因为它会采用将最久远的记录丢掉的方式让新元素入栈,也就是说总是按照规定的数量要求保持最近的历史操作。比如栈的空间是5,当a,b,c,d,e 入栈之后,如果继续让元素f入栈,那么栈中的元素将是b,c,d,e,f。
2、实现
代码
class LeakyStack:def __init__(self, capacity):self.stack = [None] * capacityself.top = -1#初始化指针为-1,代表栈为空self.capacity = capacitydef push(self, item):if self.is_full():self.pop_oldest()#如果栈满将最久远的元素pop,同时剩余的元素向下移动self.stack[self.top + 1] = item#将新元素压入栈self.top += 1#指针指向栈顶def pop(self):if self.is_empty():#栈空不能弹栈raise IndexError("pop from an empty LeakyStack")item = self.stack[self.top]#取当前指针指向的元素赋值给itemself.stack[self.top] = None#把栈顶元素弹出self.top -= 1#指针下移一位return item#返回itemdef peek(self):if self.is_empty():#只获取栈顶元素而不弹栈raise IndexError("peek from an empty LeakyStack")return self.stack[self.top]def