闲聊
之前笔试的时候遇到了一个面试题,题目如下:有一个栈,往里面一次压入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) )
讨论
代码还有需要的改进的地方,欢迎交流学习!
网友评论