功能需求
一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1.如果将这个栈经过系列转置之后,从栈顶到栈底为1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,而不是使用其他数据结构,也不能使用第二个栈。
详细解析
在之前我们曾经使用过两个栈操作一组数据,经过两次压栈出栈操作,我们可以得到逆序队列。但是题目要求的是主要考察使用递归函数来设计,所以我们需要设计出两组递归函数来模仿这两个栈操作,从而实现逆序栈。
递归函数一:将栈stack的栈底元素返回并移除。具体实现如下代码中的getAndRemoveLastElement方法。
代码实现1
public static int getAndRemoveLastElement (Stack<Integer> stack) {
// 栈中弹出一个数据,并保存数据
int result = stack.pop();
// 判断栈中元素时候为空,如果没有元素这返回
if (stack.isEmpty()) {
return result;
} else {
// 使用递归函数:调用自己本身,循环弹出栈顶元素,直到栈中无元素
int last = getAndRemoveLastElement(stack);
// 栈中依次压入最开始弹出的数据
stack.push(result);
// 返回所存的栈数据
return last;
}
}
我们来画个图来分析一下这个算法的运行流程
递归函数二:逆序一个栈,那么我们可以使用第二种方法,也就是题目要求的方法,具体的需要的是reserve方法。可以调用上面的getAndRemoveLastElement()方法。
代码实现2
public static void reverse(Stack<Integer> stack) {
// 栈数据判空操作
if (stack.isEmtpy()) {
return;
}
// 调用上面的操作函数来删除栈顶数据得到逆序结果
int i = getAndRemoveLastElement(stack);
// 递归调用reverse方法
reverse();
// 栈底存入栈数据
}
让我们也来分析一下这个程序的执行流程
getAndRemoveLastElement()方法在图中简单表示为get方法,表示移除并返回当前栈元素
总结分析
当我们碰到使用递归来操作循环的时候,一定要考虑到的两个问题是:第一这个方法执行到什么时候,从程序的开始到再次调用本方法的时候结束。第二就是当调用完成或者不符合条件而跳出递归的时候,调用本方法之后的代码将是如何继续运行的。其实你只需要再进行详细分化一下,不难得出一个规律,递归相当于一个while(true)的死循环,也就是你如何使用break的问题,本身这个问题就是让你熟悉了解递归算法到底是怎样的执行流程,其实不难发现,先弹出,再弹出,弹完了之后再去运行之后的保存,就相当于你走路一样,刚走到终点,不能直接飞回起点吧。ok今天的分享就是这...