堆栈是什么?
堆栈是只在一端(栈顶)进行插入和删除操作的线性表,故又称为先进后出线性表
堆栈的操作有哪些?
入栈(Push)和出栈 (Pop)
堆栈的实现存储方式有哪些?
顺序存储(数组)和链式存储(链表)
代码实现 (数组)
- 堆栈是否已满
- 堆栈是否为空
- 入栈,将元素压入堆栈
- 出栈,删除并返回栈顶元素
class listStack:
"""顺序存储实现"""
def __init__(self, size):
self.size = size
self.stack = [0] * size
self.top = -1
def push(self, item):
if self.isFull():
raise Exception('栈满')
else:
self.top += 1
self.stack[self.top] = item
def pop(self):
if self.isEmpty():
raise Exception('栈空')
else:
data = self.stack[self.top]
self.stack[self.top] = 0
self.top -= 1
return data
def isFull(self):
return self.top + 1 == self.size
def isEmpty(self):
return self.top == -1
def showStack(self):
print(self.stack)
if __name__ == '__main__':
stack = listStack(5)
print(stack.isFull())
print(stack.isEmpty())
for i in range(1,6):
stack.push(i)
stack.showStack()
stack.pop()
stack.showStack()
print(stack.top)
代码实现(链表)
- self.dummyhead(哑结点),那么哑结点的下一个结点(self.dummyhead.next)就是链表的第一个结点
- 初始化链表
- 入栈:将元素item插入到表尾
- 出栈:删除表头并返回元素(链表实现堆栈和队列,删除操作都应在表头实现)
- 链表是否为空,出栈需要判断
class Node:
"""初始化链表"""
def __init__(self, val):
self.val = val
self.next = None
class linkStack:
"""链式存储实现"""
"""补充一点:链式存储没有长度限制,不需要判断栈满"""
def __init__(self):
self.dummyhead = Node(0) #初始化哑结点
self.curr = self.dummyhead
def push(self, item) ->Node:
"""一个元素入栈,插入表头"""
if not isinstance(item, Node):item = Node(item)
item.next = self.curr.next
self.curr.next = item
return self.dummyhead.next
def pushList(self, l:list):
"""
循环遍历列表的元素入栈,插入表头
:param l:
:return:
"""
if not l:raise Exception('列表l为空')
for item in l:
item = Node(item)
item.next = self.curr.next
self.curr.next = item
return self.dummyhead.next
def pop(self):
if self.isEmpty():raise Exception('栈空')
data = self.curr.next.val
self.curr.next = self.curr.next.next
return data
def isEmpty(self):
return self.dummyhead.next == None
def printStack(self):
"""
循环打印链表中的每个值
:return:
"""
currnode = self.dummyhead.next
while currnode:
print(currnode.val)
currnode = currnode.next
if __name__ == '__main__':
stack = linkStack()
print(stack.isEmpty())
stack.pushList([1,2,3,4,5])
stack.printStack()
print(stack.isEmpty())
for i in range(5):
print(stack.pop())
#stack.pop() #Expected:抛出栈空的异常