一、stack概述
stack是一种FILO(First in last out) 的数据结构。在程序开发中具有重要的地位。在STL中stack是一种容器适配器。STL对stack的部分定义如下。
另外一种容器适配器是queue,是一种先进先出的数据结构,具体的信息可以参考《STL 源码解析》。
二、stack的应用
对于stack的应用可以参照栈的应用。在这里提两个小技巧:
1、进制转换的简单算法:N=(N div d)*d + N mod d; div为除法运算,mod为取模运算;
2、将number上调至N的倍数简单算法:(number+N-1)& ~(N-1);与应用无关,笔者感觉这是一个不错的算法,故和大家分享。
下面以归并排序为依托,看一下栈与递归实现的关系,并且看递归函数连续两次调用自己函数每步如何返回,执行顺序是怎么样的?
三、归并排序 ----栈与递归实现
首先感谢 Cinderella 的一篇从递归排序归并算法看递归函数连续两次调用自己函数每步如何返回一文,对笔者的帮助。
1.归并排序算法
归并排序算法是一种效率高且稳定的排序算法,时间复杂度为O(n+logn),缺点是比较占用内存,引用大量的递归。归并算法利用了分治策略。
归并排序算法的原理:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度是1,然后两两归并,得到[n/2]个长度是1或2的有序子序列;在两两归并.....,直至得到一个长度为n的有序序列为止。
归并排序的算法实现如下:(大话数据结构为参考)
归并算法在代码上比较清晰,可以发现在代码过程中连续两次采用递归实现,在刚看到这一块时,很是费解,不清楚每一步的返回值与调用顺序。下面笔者采用一种最为直接的方式来展现调用的过程与每一步的返回值。
综上所述 整体的调用过程为:下面是简化写法
Msort(1,4)--->Msort(1,2)---->Msort(1,1)---->Msort(2,2)---->Merge(1,1,2)---->Msort(3,4)--->Msort(3,3)--->Msort(4,4)---->Merge(3,3,4)---->Merge(1,2,4)
栈与递归实现过程
具体的数值赋值过程如下:
将有序链表或者有序数组转换为二叉树的过程也利用到了分治策略和递归实现 可以与归并算法一起练习。
具体实现 方案可参考 将有序数组转换为平衡二叉树 。
第一篇博客,有不正确的地方欢迎指正。