什么是栈?
栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈),允许进行操作的一端称为"栈顶",另一固定端称为"栈底",当栈中没有元素时称为"空栈"
如图所示我们可以清晰的看到,我们只对栈的栈顶进行操作,属于先进后出的原则。
顺序栈代码实现
"""
python实现栈模型 - 顺序存储
设计思路:
1. 栈: LIFO 后进先出
2. 设计
栈顶:列表尾部(入栈 出栈)
栈底: 不进行任何操作
"""
import time
class Stack:
def __init__(self):
# 初始化一个空栈
self.elems = []
def is_empty(self):
# 判断是否为空栈
return self.elems == []
def push(self,item):
# 入栈操作
self.elems.append(item)
def destack(self):
# 出栈操作
if self.is_empty():
raise Exception('Stack is empty')
return self.elems.pop()
if __name__ == '__main__':
s = Stack()
# 入栈: 100 200 300
s.push(100)
s.push(200)
s.push(300)
# 出栈: 300 200 100
print(s.destack())
print(s.destack())
print(s.destack())
time.sleep(0.1)
print(s.destack())
链式栈代码实现
"""
链式存储模式去实现栈模型
思路:
1.栈:LIFO 后进先出
2.设计:
链表头顶: 栈顶
入栈:在链表头部添加一个节点
出栈:在链表头部删除一个节点
链表尾部:
"""
class Node:
def __init__(self,value):
self.value = value
self.next = None
class Stack:
def __init__(self):
# 初始化一个空栈
self.head = None
def is_empty(self):
# 判断栈是否为空
return self.head == None
def push(self,item):
# 入栈:在链表头部添加一个节点
node = Node(item)
node.next = self.head
self.head = node
def destack(self):
# 出栈:删除链表头节点
if self.is_empty():
raise Exception('It is empty')
item = self.head.value
self.head = self.head.next
return item
if __name__ == '__main__':
s = Stack()
# 入栈: 100 200 300
s.push(100)
s.push(200)
s.push(300)
# 出栈: 300 200 100
print(s.destack())
print(s.destack())
print(s.destack())