栈 Stack
栈的结构好比平时叠在灶台上的一摞盘子。我们最先使用的总是最上方的盘子,且使用完后也是把盘子放在最上面。即它是后进者先出,先进者后出的一种约束型数据结构,它可以由数组和链表的方式实现,如图所示:
栈的应用
- 我们在使用浏览器的前进和后退功能的时候就是用了栈结构。这里我们拿后退功能举例:如果我们点击浏览器后退功能,我们总是看到的是最近浏览过的页面,我们只有不断继续点击,才能浏览到最早的页面。
- 在编程语言实现函数这一功能的时候,也用了栈的设计思路。编程语言总是从主函数
main
开始执行,好比是它最先进入栈的底部。假设主函数里面又有一个sum
函数,那么sum
接着进入栈中,待sum
处理结束后弹出栈,最后main
函数也跟着出栈。这就实现了编程语言的函数栈功能。
栈的实现
数组
class ArrayStack(object):
def __init__(self, capacity: int):
self.items = [None] * capacity
self.size = 0
self.capacity = capacity
def __len__(self):
return self.size
def push(self, item) -> bool:
if self.size >= self.capacity:
return False
self.items[self.size] = item
self.size += 1
return True
def pop(self):
if self.size == 0:
return None
tmp = self.items[self.size - 1]
self.size -= 1
return tmp
def __repr__(self):
return str(self.items[:self.size])
if __name__ == '__main__':
stack = ArrayStack(3)
for i in range(4):
print("stack.push(%d):" % i, stack, stack.push(i))
for i in range(4):
print("stack.pop():", stack, stack.pop())
终端结果输出:
stack.push(0): [0] True
stack.push(1): [0, 1] True
stack.push(2): [0, 1, 2] True
stack.push(3): [0, 1, 2] False
stack.pop(): [0, 1] 2
stack.pop(): [0] 1
stack.pop(): [] 0
stack.pop(): [] None
链表
class ListNode:
def __init__(self, value: object, next=None):
self.value = value
self.next = next
class LinkedStack:
def __init__(self):
self.top = ListNode(None)
def __repr__(self) -> str:
vals = []
p: ListNode = self.top
while p:
vals.append(str(p.value))
p = p.next
return '->'.join(vals)
def push(self, value):
new_top = ListNode(value)
new_top.next = self.top
self.top = new_top
return True
def pop(self):
value = self.top.value
self.top = self.top.next
return value
if __name__ == "__main__":
stack = LinkedStack()
for i in range(4):
print("stack.push(%d):" % i, stack.push(i), stack)
for i in range(4):
print("stack.pop():", stack.pop(), stack)
终端结果输出:
stack.push(0): True 0->None
stack.push(1): True 1->0->None
stack.push(2): True 2->1->0->None
stack.push(3): True 3->2->1->0->None
stack.pop(): 3 2->1->0->None
stack.pop(): 2 1->0->None
stack.pop(): 1 0->None
stack.pop(): 0 None