美文网首页程序员
JavaScript用递归方法将栈的元素颠倒

JavaScript用递归方法将栈的元素颠倒

作者: 即限公国 | 来源:发表于2017-10-18 01:00 被阅读0次

    闲聊

    之前笔试的时候遇到了一个面试题,题目如下:有一个栈,往里面一次压入1,2,3,4,5这几个元素,得到的结果为[1,2,3,4,5],现在只能用递归的方法,将栈里面的元素颠倒,得到的结果为[5,4,3,2,1]。要是没有题目要求的话,这个就比较简单了,直接arr.reverse()就可以解决问题,不过只能用递归就有意思了,菜鸟一般的我就得好好研究一番了。

    动手分析

    我们把栈[1, 2, 3, 4, 5]看成由两部分组成:栈顶元素1和剩下的部分[2, 3, 4, 5]。

    如果我们能把[2, 3, 4, 5]颠倒过来,变成[5, 4, 3, 2],然后在把原来的栈顶元素1放到底部,那么就整个栈就颠倒过来了,变成[5, 4, 3, 2, 1]。

    接下来我们需要考虑两件事情:一是如何把[2, 3, 4, 5]颠倒过来变成[5, 4, 3, 2]。我们只要把[2, 3, 4, 5]看成由两部分组成:栈顶元素2和剩下的部分[3, 4, 5]。

    我们只要把[3, 4, 5]先颠倒过来变成[5, 4, 3],然后再把之前的栈顶元素2放到最底部,也就变成了[5, 4, 3, 2]。

    至于怎么把[3, 4, 5]颠倒过来……很多读者可能都想到这就是递归。也就是每一次试图颠倒一个栈的时候,现在栈顶元素pop出来, 再颠倒剩下的元素组成的栈,最后把之前的栈顶元素放到剩下元素组成的栈的底部。递归结束的条件是剩下的栈已经空了

    秀一波代码


    //这个函数的作用是把栈中的元素展开
    
    function reverseStack(arr){
    
        if(arr.length != 0 ){
    
            var topItem = arr.pop()
    
            reverseStack(arr)
    
            pushStack(arr, topItem)
    
        }
    
        return arr
    
    }
    
    //这个函数的作用是把函数进行颠倒
    
    function pushStack(arr, item){
    
        console.log(arr)
    
        if(arr.length == 0){
    
            arr.push(item)
    
        }else{
    
            var topItem1 = arr.pop()
    
            pushStack(arr, item)
    
            arr.push(topItem1)
    
            return arr
    
        }
    
    }
    
    var arr = new Array(1,2,3,4,5,6,7,8,9,10)
    
    console.log( reverseStack(arr) )
    

    讨论

    代码还有需要的改进的地方,欢迎交流学习!

    相关文章

      网友评论

        本文标题:JavaScript用递归方法将栈的元素颠倒

        本文链接:https://www.haomeiwen.com/subject/nvtsuxtx.html