美文网首页程序员
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