
题目:
一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、 3、2、1。将这个栈转置后,从栈顶到栈底为1、2、3、4、5,也就是实 现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。
思路:
利用递归调用栈的特性,通过两个递归函数协作:
-
移除并返回栈底元素:通过递归弹出栈顶元素,直到栈底元素被弹出,然后将非栈底元素重新压回栈中。
-
递归逆序栈:反复移除栈底元素并递归逆序剩余栈,最后将移除的栈底元素压回栈顶(此时栈已逆序,压入的元素成为新栈顶)。
代码实现:
import java.util.Stack;
public class StackReverser {
// 递归函数1:移除并返回栈底元素
private static int getAndRemoveLastElement(Stack<Integer> stack) {
int top = stack.pop(); // 弹出栈顶元素
if (stack.isEmpty()) {
return top; // 栈空时,top即为栈底元素
} else {
int last = getAndRemoveLastElement(stack); // 递归获取栈底元素
stack.push(top); // 将非栈底元素重新压回栈中
return last;
}
}
// 递归函数2:逆序栈
public static void reverseStack(Stack<Integer> stack) {
if (stack.isEmpty()) {
return; // 递归终止条件:栈空
}
int last = getAndRemoveLastElement(stack); // 获取栈底元素
reverseStack(stack); // 递归逆序剩余栈
stack.push(last); // 将原栈底元素压入栈顶
}
// 测试代码
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
// 压入元素:1->2->3->4->5(栈顶到栈底:5,4,3,2,1)
for (int i = 1; i <= 5; i++) {
stack.push(i);
}
System.out.println("原始栈(栈顶->栈底): " + stack); // 输出:[5,4,3,2,1]
reverseStack(stack); // 逆序栈
System.out.println("逆序后(栈顶->栈底): " + stack); // 输出:[1,2,3,4,5]
}
}
代码解析:
-
getAndRemoveLastElement函数:-
弹出栈顶元素
top。 -
递归调用自身,直到栈为空(此时返回的
top即栈底元素)。 -
递归返回时,将非栈底元素重新压栈,保持栈中除栈底外的元素顺序不变。
-
-
reverseStack函数:-
递归移除栈底元素
last,并继续逆序剩余栈。 -
当栈为空时开始返回,将
last压入栈顶。 -
最终实现栈底元素成为新栈顶,完成逆序。
-
-
测试流程:
-
初始化栈:压入
1->2->3->4->5(栈顶到栈底为5,4,3,2,1)。 -
调用
reverseStack后,栈顶到栈底变为1,2,3,4,5。
-
小结:
-
时间复杂度: O(n²)(每个元素需递归 n 层,共 n 个元素)
-
空间复杂度: O(n)(递归调用栈深度为 n)
-
递归的深度=栈的大小:当栈元素过多时,可能引发
StackOverflowError。 -
逆序的实质:通过递归将栈底元素移至栈顶,重复此过程直至栈完全逆序。
-
后序压栈:在递归返回阶段压栈,确保原栈底元素最后压入(成为新栈顶)。

7163

被折叠的 条评论
为什么被折叠?



