本题来自程序员代码面试指南
题目
一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1。将这个栈转置后,从栈顶到栈底为1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。
-
递归函数一:将栈stack的栈底元素返回并移除
递归函数一
-
递归函数二:逆序一个栈,就是题目要求实现的方法,具体过程就是如下代码中的reverse方法。
递归函数二
public class ReverseStack {
/**
* 将栈的栈底元素出栈返回
* @param stack
* @param <T>
* @return
*/
public static <T> T getAndRemoveLastElement(Stack<T> stack) {
//讲一个值弹出栈
T result = stack.pop();
//栈空返回栈底元素
if (stack.isEmpty()) {
return result;
} else {
//在递归调用的过程中栈底元素始终保持在last里
T last = getAndRemoveLastElement(stack);
//调用返回,将非栈底元素重新压入栈中
stack.push(result);
return last;
}
}
/**
* 将栈逆序
* @param stack
* @param <T>
*/
public static <T> void reverse(Stack<T> stack) {
//递归调用的返回条件
if (stack.isEmpty()) {
return;
}
//返回栈中最后一个值
T andRemoveLastElement = getAndRemoveLastElement(stack);
reverse(stack);
stack.push(andRemoveLastElement);
}
}
递归看起来就像玄学,这个题在递归中套个递归,看上去就很有意思。
俩个递归分开看 ,第一个先将栈中元素弹出一个存到变量中,递归返回条件是弹出一个元素后栈空将栈底元素作为返回值返回,回到调用流程后将存在变量中的非栈底元素再次压入栈中;第二个的返回条件是栈空,而第二个每一步弹出的是栈底元素,通过这个方法实现栈的逆序。
网友评论