一.定义:
栈是一种特殊的线性表,简称为LIFO线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行,遵循后进先出的原则。
二.特点
1)只允许在一端进行插入和删除的线性表。
2)栈的插入操作称为压栈(push),栈的取出操作称为出栈(pop)。
3)栈的存储结构分为顺序存储和链式存储,顺序存储称为顺序栈,链式存储称为链式栈。
三.时间复杂度
进栈(增加元素):栈顶指针+1,新插入元素赋值给栈顶空间
出栈(删除元素):将要删除的栈顶元素赋值给e,栈顶指针-1
时间复杂度均为O(1)。
链式存储结构:时间复杂度均为O(1)。
四.基本运算
栈有两种存储方式,即线性存储(顺序栈)和链表存储(链栈)。
python 代码
栈的顺序表实现
class SStack:
#创建空栈
def __init__(self):
self._elems = []
#栈的元素总数
def __len__(self):
return(len(self._elems))
#判断空栈
def is_empty(self):
return self._elems == []
#获取栈顶元素
def top(self):
if self._elems == []:
raise StackUnderflow("空栈异常:in SStack.top()")
return self._elems[-1]
#入栈
def push(self,elem):
self._elems.append(elem)
#出栈
def pop(self):
if self._elems == []:
raise StackUnderflow("空栈异常:in SStack.pop()")
return self._elems.pop()
st1 = SStack()
st1.push(3)
st1.push(7)
st1.push(5)
len(st1)
while not st1.is_empty():
print(st1.pop())
等同于使用下面的语句
from pythonds.basic import Stack
调用
s=Stack()
print(s.isEmpty())
s.push(4)#入栈
s.push('dog')
print(s.peek())#获取栈顶元素
s.push(True)
print(s.size())#stack的大小
print(s.isEmpty())# 判断是否为空
s.push(8.4)
print(s.pop())# 弹出(删除)一个元素
print(s.pop())
print(s.size())
True
dog
3
False
8.4
True
2
栈的链表实现
# 表头作为栈顶,表尾作为栈底
# 优点:解决了顺序表的缺点-->新增节点开销小,不需要连续锋内存
# 缺点:1、依赖解释器的存储管理 2、每个节点开销
class LNode: # 表节点
def __init__(self, elem, _next=None):
self.elem = elem
self.next = _next
class LStack: #用LNode作为节点
def __init__(self):
self._top = None
def is_empty(self):
return self._top is None
def push(self, elem):
self._top = LNode(elem, self._top)
def pop(self):
if self._top is None:
raise StackUnderflow("空栈异常:in LStack.pop()")
p = self._top
self._top = p.next
return p.elem
def top(self):
if self._top is None:
raise StackUnderflow("空栈异常:in LStack.top()")
return self._top.elem
st2 = LStack()
st2.push(3)
st2.push(5)
st2.push(7)
while not st2.is_empty():
print(st2.pop())
五. 应用
1.反转字符串
from pythonds.basic import Stack
'''
1.创建空栈
2.字符串中的元素入栈
3.出栈
'''
def revstring(mystr):
s=Stack()
for i in mystr:
s.push(i)
revstr=''
while not s.isEmpty():
revstr=revstr+s.pop()
return revstr
参考资料:
数据结构与算法分析
https://runestone.academy/runestone/books/published/pythonds/BasicDS/ImplementingaStackinPython.html