栈
栈是一种特殊的线性表,其插入删除操作只能在表的尾部进行
在栈中允许进行插入删除的操作的一端为栈顶,另一端为栈底
栈的插入叫做入栈,栈的删除叫做出栈
栈是先进后出,类似往箱子里放衣服,先放进来的衣服,最后才能拿出去,因为他在最底下
顺序栈:基于顺序存储的实现
链式栈:基于链式存储的实现
入栈和出栈都在栈顶进行,所以不存在栈的任意位置插入和删除的操作,所以不需要设置头节点,只需要将指针top指向栈顶元素节点,每个节点的指针域指向其后继节点
顺序栈
顺序栈用数组来实现,入栈出栈操作都是在栈顶进行
class SqStack:
def __init__(self,maxSize):
self.maxSize = maxSize # 顺序栈的最大存储单元
self.stackElem = [None] * self.maxSize # 顺序栈存储空间
self.top = 0 # 指向栈顶元素的下一个存储单位位置
def clear(self):
"""将栈置空"""
self.top = 0
def isEmpty(self):
"""判断栈是否为空"""
return self.top == 0
def length(self):
"""返回栈的数据元素个数"""
return self.top
def peek(self):
"""返回栈顶元素"""
if self.isEmpty():
return None
return self.stackElem[self.top - 1]
def push(self,x):
"""数据元素入栈"""
if self.top == self.maxSize:
return '栈满'
self.stackElem[self.top] = x
self.top += 1
def pop(self):
"""出栈"""
if self.isEmpty():
return '栈为空'
temp = self.stackElem[self.top]
self.top -= 1
return temp
def display(self):
"""输出栈中所有元素"""
# for i in self.stackElem:
# print(i)
for i in range(self.top - 1,-1,-1):
print(self.stackElem[i])
链栈
采用链式存储结构
入栈和出栈都是在栈顶进行,不存在任意位置的插入删除操作
# 定义节点
class StackNode(object):
# 为什么要默认定义值跟指针呢?因为栈必须包含此两项,否则就为空
def __init__(self, x = None,next = None):
# 数据域:存储数据元素
self.val = x
# 指针域:存储下一节点的指针
self.next = None
class LinkStack(object):
# 定义top指针,作用就是每次入栈或者出栈之后,他能灵活指向
def __init__(self,node = None):
self.__top = node
# 判断栈是否为空
def is_empty(self):
return self.__top == None
# 计算栈的长度
def length(self):
count = 0
temp_top = self.__top
while temp_top != None:
count += 1
temp_top = temp_top.next
return count
# 入栈
def push(self,item):
node = StackNode(item,self.__top)
# 当前节点变为top节点的指向,完成入栈操作
self.__top = node
# 出栈
def pop(self):
if self.is_empty():
return False
temp = self.__top
self.__top = self.__top.next
return temp.val
# 遍历
def travel(self):
cur = self.__top
while cur != None:
print(cur.val)
cur = cur.next
参考资料
《数据结构(Python版)》作者:吕云翔、郭颖美、孟爻