@cxm-2016
2016-11-06T15:01:29.000000Z
字数 507
阅读 1812
算法
版本:1
作者:陈小默
声明:禁止商用,禁止转载
题目要求:仅仅使用递归操作对一个栈进行逆序。
思路:使用汉诺塔问题的思考方式,假设将这个用竹签串起的汉诺塔交给一位聪明的和尚,让他将这个塔进行翻转。那么这个和尚会想:只要我去除了最下面的圆盘,然后将剩下的汉诺塔交给下一位和尚,但是他必须还给我一个已经转置过的汉诺塔,然后我再将取下的最后一块放在顶上,不就完成了转置。那么,我应该怎么取得最后一块呢?我可以先取出最上面的一块,然后将剩下的传递下一位和尚,但是他必须将最后一块和塔分开来还给我,然后我再将最上面的一块放上去就行了。
fun <E> getLast(stack: Stack<E>): E {
val top = stack.pop()
if (stack.isEmpty)
return top
val last = getLast(stack)
stack.push(top)
return last
}
fun <E> reverse(stack: Stack<E>) {
if (stack.isEmpty)
return
val last = getLast(stack)
reverse(stack)
stack.push(last)
}