汉诺塔的思想实现栈的逆序(空间复杂度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
- 汉诺塔的思想实现栈的逆序(空间复杂度O(1) )
- O(n*lgn)时间复杂度的逆序对统计算法实现思想
- 实现链表逆序,空间复杂度为O(1)
- O(1) 空间复杂度逆序栈和排序栈
- C++将单链表的每K个结点之间逆序改进版空间复杂度O(1)
- 时间复杂度O(n),空间复杂度O(1)的排序
- 归并排序,空间复杂度O(1)的实现
- 归并排序空间复杂度O(1)的实现
- O(1)空间复杂度的归并排序
- O(1)空间复杂度的归并排序
- 空间复杂度O(1)的merge
- (C#)实现时间复杂度为O(n)空间复杂度为O(1)的数组中奇偶数分离
- Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现
- 2012百度暑期实习_空间复杂度为O(1)的排序算法的实现(java)
- 字符串移动k位的时间复杂度o(n)空间复杂度o(1)的解法
- 一个时间复杂度为O(n),空间复杂度为O(1)的排序算法
- 排序的时间复杂度为O(n),空间复杂度为O(1)
- 时间复杂度为O(N),空间复杂度为O(1)的排序算法
- android学习—— context 和 getApplicationContext()
- csdn文章编辑
- 滤波器设计指标
- golang http client使用unix domain socket
- IIS 服务器 配置伪静态的方法
- 汉诺塔的思想实现栈的逆序(空间复杂度O(1) )
- C++初学者的足迹4 作业报告3 在三个数中选取最大的
- 凸优化预备知识之范数
- 第七周 项目三 求两个数的正差值
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- 对自己的吐槽
- 如何烧写自己编译的u-boot
- ZOJ 3826 Hierarchical Notation(2014 牡丹江 D,概率DP)
- STM8建立IAR工程