栈论 : 递归与栈式访问,如何用栈实现所有递归操作(基础知识篇)

1.基础知识(了解栈结构)

 

先回顾一下关于栈的最简单知识;


本文主要涉及线性栈
假如我们不考虑栈底,栈底是固定不动的,只考虑栈顶,那么栈就像一只放在桌子上的空杯,杯底固定贴在桌子上。
而如果我们往这个杯子里放方糖,先放进去的方糖总是被后放进去的方糖压在下面,也就是说要先取出后放进去的方糖才能取出先放进去的方糖。
这就是栈所谓的 “先进后出” 特性。
再想象一下,我们把手指压在最后放进去的方糖上面,每次取出方糖的时候用手指把方糖剔出去,之后压在下一块方糖上 。这根手指就像一个标志,标志着我们当前能剔出哪块方糖。
杯子上面还能有刻度,而且每两个刻度条之间的距离正好是一块方糖的高度。

现在把水杯,方糖和手指都抽象一下。把手指抽象成一根指向杯顶(栈顶)的指针,把方糖抽象成我们要放进去的元素(element), 把水杯抽象成一个U字型的边框,来约束我们的长方形方糖只能向上堆叠。

 

 

以下的内容都会以此数据结构作为基础,讲解递归和栈的联系

可能你写过某道题目,说要用栈来实现某某功能,不能用递归。但实际上,递归用到的数据结构本质上就是栈。所以说,递归只是在你看不到的地方用了栈,完成了你的操作。

 

为什么那么说呢?

 

我们来浅浅地了解一下在内存中函数调用的过程。

众所周知,内存是的抽象模型是一串线性的单元格。

在函数调用过程中,每个函数的开始,都会在内存中一段被称为栈区的空间内创建栈帧(稍后解释)

这片栈区 就好像我们上面说的水杯,而栈帧就是上面所说的方糖

内存被编址成一个个存储单元,上面所说的两个刻度条间的空间就可以当成一个存储单元,并且每个存储单元对应一个唯一的数字(地址)

 

但实际上,函数调用过程中,在内存中是用两根指针确定一个元素的,就像杯子里装了沙,你用食指和大拇指那么一捏,表示这是一个方糖高的沙。

 

 下一篇 :

栈论 : 递归与栈式访问,如何用栈实现所有递归操作(函数调用底层篇)

 

护眼绿:

没人看的结语:

首先很感谢你看到这里,辛苦了。

文章中某些地方可能不正确或不准确,代码也可能不够高效可读,希望读者能够帮忙指正,共同学习进步。

posted @ 2019-11-04 09:20  执生  阅读(2062)  评论(0编辑  收藏  举报