Bootstrap

如何仅用递归函数和栈操作逆序一个栈(C)

import java.util.Stack;

public class ReverseByStack {

    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        reverse(stack);
        while (!stack.isEmpty())
            System.out.println(stack.pop());


    }

    //    递归函数一:将栈底元素返回并且移除
    public static int getAndRemoveLastE(Stack<Integer> stack) {
        if (stack.isEmpty())
            throw new RuntimeException("栈空");
        int result = stack.pop();
        if (stack.isEmpty())
            return result;
        int node = getAndRemoveLastE(stack);
//        还要复原栈
        stack.push(result);
        return node;


    }

    //    将拿到的元素重新压栈
    public static void reverse(Stack<Integer> stack) {
        if (stack.isEmpty())
            return;
        int i = getAndRemoveLastE(stack);//每次i都是拿到了栈底元素,先不动,先递再归
        reverse(stack);
        stack.push(i);
    }

}

这个算法的精髓在于它巧妙地结合了递归和栈的特性,通过递归深入到栈的最底层并逐层返回,在递归过程中逐步将栈底元素移除并保存,然后在归的过程中将这些元素逆序压入栈中,最终实现了栈内元素的逆序操作,整个过程无需使用额外的存储空间,仅通过递归调用和栈的自身操作就完成了逆序。

;