📅  最后修改于: 2023-12-03 15:06:33.324000             🧑  作者: Mango
堆栈是一种数据结构,它的特点是先进后出(FILO,First In Last Out)。即最先进入的数据最后出来,最后进入的最先出来。
打印堆栈元素的顺序也应该是按照先进后出的顺序。下面我们介绍一些实现从上到下打印堆栈元素的方法。
一个比较简单的方法是使用一个一次性辅助栈。主要的思路是依次将堆栈中的元素压入辅助栈中,同时记录元素的个数。然后再依次从辅助栈中弹出元素,同时输出。这样就完成了从上到下打印堆栈元素的目标。
这种方法的时间复杂度是 $O(n)$,空间复杂度也是 $O(n)$。
代码片段:
def print_stack_from_top(stack):
temp_stack = []
stack_size = 0
# 依次将堆栈中的元素压入辅助栈中
while stack:
val = stack.pop()
temp_stack.append(val)
stack_size += 1
# 从辅助栈中依次弹出元素,同时输出
for i in range(stack_size):
print(temp_stack.pop())
另一种方法是使用递归。主要的思路是将栈中的元素依次弹出,并将其压入递归栈中。当栈为空时,递归打印递归栈中的元素。
这种方法的时间复杂度为 $O(n)$,空间复杂度也为 $O(n)$。但是,由于递归函数的调用开销,实际执行效率可能会比方法一差一些。
代码片段:
def print_stack_from_top(stack):
if not stack:
return
# 将栈中元素依次弹出,并将其压入递归栈中
val = stack.pop()
print_stack_from_top(stack)
print(val)
上述两种方法都破坏了原有堆栈的结构。如果需要保持原有堆栈结构不变,可以使用两个指针,一个指向栈顶,另一个指向栈底。
主要的思路是,先利用第一个指针依次将堆栈中的元素压入栈中。然后,使用第二个指针依次访问堆栈中的元素,同时输出。这样就实现了从上到下打印堆栈元素的目标,而不破坏原有堆栈结构。
这种方法的时间复杂度和空间复杂度都为 $O(n)$。
代码片段:
def print_stack_from_top(stack):
top = stack[-1]
bottom = stack[0]
while top != bottom:
val = stack.pop()
print(val)
top = stack[-1]
print(bottom)