汉诺塔的思想实现栈的逆序(空间复杂度O(1) )

来源:互联网 发布:知乎 阳台躺椅 书桌 编辑:程序博客网 时间:2024/06/06 09:06
一本练习册的源代码,没解释,三层递归,研究了很久才明白.
源代码:
static void ReverseStack(ref Stack stack){    if (stack.Count == 0)        return;    object top = stack.Pop();    ReverseStack(ref stack);    if (stack.Count == 0)    {        stack.Push(top);        return;    }    object top2 = stack.Pop();    ReverseStack(ref stack);//p1    stack.Push(top);    ReverseStack(ref stack);//p2    stack.Push(top2);        }
分析:
设一个栈:1 2 .... n
1. 弹出:  栈:2 .... n   top=1;
2. 逆序:  栈:n .... 2   top=1;
3. 弹出:  栈:n-1 .... 2  top=1,top2=n;
4. 逆序:  栈:2 .... n-1  top=1,top2=n;
5. 压入:  栈:1 2 .... n-1  top2=n;
6. 逆序:  栈:n-1 .... 1  top2=n;
7. 压入:  栈:n n-1 .... 2 1 ;    完成逆序
思路分析:
  递归的设计方法无非就是分解子问题,找出边界条件.汉诺塔分解子问题是将一个元素拿出来,剩下的假设仍可以完成函数功能,再把那个元素按要求放回去,形成功能函数.这里问题分为弹出一个元素,再逆序所有的元素,再把元素插回底部. 回底部的话,则需利用已有的假设功能[逆序]来设计实现. 3-7步则为实现此功能.
0 0