码迷,mamicode.com
首页 > 其他好文 > 详细

用递归函数进行栈的逆序

时间:2015-08-13 00:57:58      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:

天下没有免费的午餐。这个题目来自于牛客网: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()将栈底的元素取出来并缓存到变量中,直到栈空,然后开始逆向将每层变量值入栈,最后原栈中的数据得到了逆序存放。递归调用过程如下:

技术分享

 


记录,总结,提升。

用递归函数进行栈的逆序

标签:

原文地址:http://www.cnblogs.com/gsf-blog/p/4725847.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!