📜  从上到下打印堆栈元素(1)

📅  最后修改于: 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)