天下没有免费的午餐。这个题目来自于牛客网:http://www.nowcoder.com/773456
题目大意:给定一个栈,不用其他数据结构辅助,将栈内容逆序。
假设允许用其他数据结构,我们可以很快想到,用另外一个栈,将原栈内容“灌”到另一个栈里面即可。
但是左程云老师说,不允许。
递归的本质是栈的运用。所以我们可以借助递归让系统为我们创建这样一个“辅助栈”
Talk is cheap, here is the code:
1 public static void reverseStack(Stack<Integer> stack){ 2 if(stack.isEmpty()) return; 3 int temp = getBottomData(stack); 4 reverseStack(stack); 5 stack.push(temp); 6 } 7 8 public static int getBottomData(Stack<Integer> stack){ 9 int res = stack.pop(); 10 if(stack.isEmpty()){ 11 return res; 12 } 13 int temp = getBottomData(stack); 14 stack.push(res); 15 return temp; 16 }
通过函数名即可知道这两个函数的作用。
核心函数是:getBottomData(Stack<Integer> stack),递归调用过程图示如下:
顺着递归的过程走下去,可以发现,getBottomData(Stack<Integer> stack)函数的功能就是返回栈的栈底元素,并使得原来的栈数据依次往栈底移动。
如上图所示,经过一次作用后,原栈[4, 3, 2 , 1]弹出了最底部的元素1,栈的长度减1。
接下来解释reverseStack(Stack<Integer> stack)函数。
此函数的递归思路比较简单,每层递归通过getBottomData()将栈底的元素取出来并缓存到变量中,直到栈空,然后开始逆向将每层变量值入栈,最后原栈中的数据得到了逆序存放。递归调用过程如下:
记录,总结,提升。
时间: 2024-11-07 23:28:06