递归反转栈的顺序-------只使用常数量个变量

转载地址:http://www.cnblogs.com/4everlove/p/3666016.html

我们要反转一个栈,如果使用另外一个栈作为辅助的话,那么反转起来很简单,一个接一个push到辅助栈里再push回来就行了。那么假如不能使用辅助栈,数组等空间为O(n)的数据结构,只使用O(1)的空间复杂度即只能有常数个变量,怎么实现将栈反转?即原来的栈顶在栈底,栈底变成栈顶。

 

面试官提示我使用递归来考虑。当时我没有想出来……

这道题使得我对递归算法的理解,感觉提升了一小下。

让我懂得了递归算法不能考虑中间过程,上一层的递归可以直接使用下一层的递归结果,即假设下一层已经完成了我们的要求就行了,最后只需要考虑最后一层递归退出的条件就行了。

回来以后想,这道题大概是这样的:

  • 首先假设栈里面从栈底到栈顶存储的依次是 1 2 3 4 5,我们反转以后希望得到的结果是 5 4 3 2 1.
  • 第一步pop出来第一个数5,存到temp1中,此时的栈中由下到上是1 2 3 4。
  • 递归调用自身,不用考虑具体的过程,我们只需要知道这个递归调用结束后得到的结果是使栈中的元素变成了由下到上 4 3 2 1(因为这个函数本身的意思就是反转栈)。
  • 此时pop出来第二个数1 ,存到temp2中,此时的栈中由下到上是 4 3 2。
  • 再递归调用本身,抽象考虑这个递归完成后得到的结果是栈中的值变成了 2 3 4。
  • 接着我们把push(temp1),栈变成了 2 3 4 5。
  • 接着递归调用本身,递归完成后栈变成了 5 4 3 2。
  • 接着push(temp2)。好了,栈变成了 5 4 3 2 1,反转完成!

接下来我们需要考虑递归函数结束的条件了,该函数的结束条件是当栈为空或者栈里只有一个元素的时候,return。

如何知道栈里只有一个元素?

我们可以先记录下栈顶元素,然后pop,如果栈变成空,则说明是只有一个元素,push回去再return。


 

结合上图和思路,给出代码:

<pre name="code" class="java">public void reverseStack(stack<String> s){
    if(s.empty())
        return ;
    else {
        //如果s里面只有一个元素,就返回,否则就不返回。具体实现是先pop出来一个,判断剩下的是不是空栈。
        String a = s.pop();
        s.pop();
        if(s.isEmpty()){
            s.add(a);
            return ;
        }
        else{
            s.add(a);
        }
    }
    String temp1 = s.pop();
    reverseStack(s);
    

    String temp2 = s.pop();

    reverseStack(s);
    s.add(temp1);
    reverseStack(s);
    s.add(temp2);
}


 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值