"""
链式栈
linkstack.py
思路分析:
1.源于链表结构
2.封装栈的操作方法(入栈,出栈,栈空,栈顶)
3.链表的开头作为栈顶(不用每次遍历,效率高,怎样实现简单)
"""
# 链式栈异常
class StackError(Exception):
pass
# 定义节点类
class Node:
"""
思路:将自定义的类视为节点的生成类,
实例对象中包含数据的部分和下一个节点的next
"""
def __init__(self,val,next = None):
self.val = val # 有用数据
self.next = next # 循环下一个节点的关系
# 链式栈
class LinkStack:
"""
链式栈:
1.标记栈顶的None,
2.有新元素压入,指向None,
3.top指向新元素,
4.重复2,3步骤,
5.
"""
def __init__(self):
# 标记栈顶位置
self._top = None
# 入栈
def push(self, val):
# node = Node(val) # 先有节点
# node.next = self._top # 节点的next指向top
# self._top = node # top指向节点
self._top = Node(val,self._top) # 一步到位
# 出栈,重新定义方法
def pop(self):
if self._top is None:
raise StackError("Stack is empty")
value = self._top.val
self._top = self._top.next
return value # 弹出并返回
# 判断栈是否为空
def is_empty(self):
return self._top == None # 空返回True
# 查看栈顶元素
def top(self):
if self._top is None:
raise StackError("Stack is empty")
return self._top.val
if __name__ == "__main__":
ls = LinkStack()
ls.push(1)
ls.push(2)
ls.push(3)
print(ls.top())