首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

递归反转一个栈 有代码 请解释程序解决方案

2012-09-12 
递归反转一个栈 有代码 请解释程序目标:递归反转一个栈,要求不得重新申请一个同样的栈,空间复杂度o(1)博主

递归反转一个栈 有代码 请解释程序
目标:递归反转一个栈,要求不得重新申请一个同样的栈,空间复杂度o(1)
博主说: 算法思想:汉诺塔的思想,非常复杂,玩过九连环的人都想得通的

C/C++ code
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);        }


请问两个问题:
第一个: 注释p1,p2两处的递归用来干什么?顺序可以点到吗?
第二个:如果做到只用一个堆栈就搞定反转的?



[解决办法]
探讨

递归本身就很占 空间了,隐形的?哈哈。

[解决办法]
我貌似看懂了
例如栈
1
2 object top = stack.Pop();后栈变为 2
3 3
4 4
ReverseStack(ref stack); 后站变为
4
3
2
object top2 = stack.Pop();后变为
3
2
(可以注意到1是栈顶元素,4是栈底元素)
然后 ReverseStack(ref stack);//p1 变为
2
3
然后 stack.Push(top);变为
1
2
3
(注意到到这一步你可以发现他把栈底元素4取出来了,我感觉这是理解这个算法的关键)
最后几步就很简单了,
3
2
1
最后到
4
3
2
1

热点排行