栈是典型的先入后出的数据结构,在很多场合都有重要的应用,本文主要介绍用python实现栈的顺序存储结构和链式存储结构。
一 栈的顺序存储结构
栈的顺序存储结构,其实是线性表顺序存储结构的简化,使用python列表的append()和pop()可以很轻松的实现出栈,入栈的操作,具体的代码如下。入栈和出栈操作均没有涉及到循环结构,因此时间复杂度均是O(1)。
class stack(object):
def __init__(self,maxsize):
self.size = maxsize
self.stack = []
self.top = -1
# 入栈
def push(self,data):
# 栈满
if (self.top + 1) == self.size:
print("The stack is full!")
return 0
else:
self.stack.append(data)
self.top += 1
# 出栈
def pop(self):
# 栈空
if self.top == -1:
print("The stack is empty!")
return 0
else:
self.stack.pop()
self.top -= 1
# 显示栈中元素
def show(self):
print(self.stack)
if __name__ == '__main__':
# 新建size为50的栈
s = stack(50)
# 栈中压入0~9
for i in range(10):
s.push(i)
s.show()
# 删除栈顶的元素9
s.pop()
s.show()
程序的输出结果如下:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
二 栈的链式储存结构
栈的顺序存储结构很方便,因为它只准栈顶进出元素,不存在线性表插入和删除需要移动元素的问题。但是也存在一个缺点,就是必须事先确定存储空间的大小,栈满时就要手动扩充容量,比较麻烦。而使用链表来存储栈,基本不存在栈满的情况,栈顶放在链表的头部,栈顶指针代替头结点。
# 定义节点
class Node(object):
def __init__(self, val):
self.val = val
self.next = None
# 定义链栈
class LinkStack(object):
def __init__(self):
self.top = -1
# 入栈
def push(self, data):
s = Node(data)
s.next = self.top
self.top = s
# 出栈
def pop(self):
if self.top == None:
print("The LinkStack is empty!")
return 0
else:
value = self.top.val
self.top = self.top.next
return value
if __name__ == "__main__":
s = LinkStack()
# 0~9压入栈中
for i in range(10):
s.push(i)
# 栈顶的3个元素出栈
for i in range(3):
print(s.pop())
程序输出的结果为:
9
8
7