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