前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >栈论 : 递归与栈式访问,如何用栈实现所有递归操作(基础知识篇)

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

作者头像
执生
发布2020-09-27 10:54:02
3270
发布2020-09-27 10:54:02
举报
文章被收录于专栏:立权的博客立权的博客

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

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

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

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

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

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

为什么那么说呢?

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

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

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

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

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

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

下一篇 :

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

护眼绿:

没人看的结语:

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档