

栈 - 数据结构在实际项目中的使用 - Jiajun的编程随想
source link: https://jiajunhuang.com/tutorial/data_structure/stack.md?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

栈 - 数据结构在实际项目中的使用 - Jiajun的编程随想
日常业务中的确很少用到栈这个数据结构。但是实际上,代码中无处不是栈,为什么?因为函数调用就是通过栈来实现的。
首先我们来看看栈是怎样一种结构。维基百科上这样定义:
In computer science, a stack is an abstract data type that serves as a collection of elements, with two principal operations:
push, which adds an element to the collection, and
pop, which removes the most recently added element that was not yet removed.
The order in which elements come off a stack gives rise to its alternative name, LIFO (last in, first out).
也就是说,栈有这样的特性:
- 栈有两个操作,一个是push,即把数据压入该数据结构;另一个是pop,即从该数据结构中弹出一个数据
- 每次执行pop操作时,得到的总是该数据结构中最后进入的一个数据。
举个例子,如果我们按照下述步骤进行操作,那么会是这样的:
push 1
。栈中的数据是1
,没有数据返回。push 2
。栈中的数据是1, 2
,没有数据返回。push 3
。栈中的数据是1, 2, 3
,没有数据返回。pop
。栈中的数据是1, 2
,返回的数据是3。pop
。栈中的数据是1
,返回的数据是2。
栈的实际使用
上面我们说到,栈的一个典型应用就是函数调用。我们来看看函数调用是怎么通过栈来实现的。有以下代码:
def inner(foo):
print("进入inner函数")
print("离开inner函数")
def outter(bar):
print("进入outter函数")
inner(bar)
print("离开outter函数")
if __name__ == "__main__":
outter("hey")
我们来看看调用结果:
$ python stack.py
进入outter函数
进入inner函数
离开inner函数
离开outter函数
一个典型的函数调用过程,就是把函数调用之后要执行的指令的地址压入栈中(例如此处outter中调用inner之后的地址),然后将要 调用的函数压入栈中,随后将(部分)参数压入栈中,然后把要执行的指令的地址改为所调用的函数的地址,当这个函数执行完成之后, 便会找到此前所保存的返回地址,再接着执行原本函数中的代码。
这一篇中我们首先介绍了栈的基本属性,然后模拟了一个栈的执行,接着我们了解了栈这个数据结构在实际编程中的应用,那就是函数调用。
参考资料:
旧电脑也不能闲着:家用备份方案 将SQLite的数据迁移到MySQL Linux托管Windows虚拟机最佳实践 为什么gRPC难以推广 关于ORM的思考 MySQL指定使用索引(使用索引提示) QT5使用GTK主题 搭建samba服务器 ssh时自动运行tmux ufw简明教程 zerotier简明教程 提取kindle笔记 一个Golang gRPC握手错误的坑 Golang(Go语言)爬虫框架colly简明教程及源码阅读与分析 选择合适的技术栈
Recommend
-
60
-
65
-
99
-
76
nomad简明教程 k8s其实太复杂,对于小团队来说,光是hold住k8s就要花好几个人力,而且k8s更新迭代太快了,有种上了贼船就下不来的感觉。 nomad就简单多了,就是一个调度器,啥也不带,显得有点简陋,不过,对于中小型团队来说,...
-
42
没用过字典(英文一般叫dict或map)的,请举个手。 字典是常用的一种数据结构,在有的语言里叫做dict,有的语言里叫做map。字典一般用来实现KV存储,也就是说,给定一个Key, 能够快速的把Value找出来。实现字典的方式一般有两种:...
-
41
链表的实际用途非常广泛,但是一般业务代码不会涉及。一般都在操作系统里,例如文件系统、内存分配;还有哈希表中, 可以用来解决冲突(key冲突时使用链表或者数组来保存);实现跳跃表等等。 链表结构和特征 首先我们...
-
38
SQLAlchemy简明教程 SQLAlchemy是Python中常用的一个ORM,SQLAlchemy分成三部分: ORM,就是我们用类来表示数据库schema的那部分 SQLAlchemy Core,就是一些基础的操作,例如 update,
-
56
DNSCrypt简明教程 我们输入 jiajunhuang.com 之后,浏览器是需要将 jiajunhuang.com 翻译成IP,然后才能建立TCP连接的。而将域名翻译成IP地址, 就是DNS服务器的事情,但是有一个小问题,DNS是明文的...
-
34
我的技术栈选型 工作已经几年了,逐步摸索到了自己的技术上限 — 还是计算机五大件。不断的追新和扩展广度已经没有太大意义,它们的实现原理也 都了解的差不多,因此现在是时候开始收缩技术栈,缩小需要不断更新的知识范围,节省...
-
7
来电拦截方案 最近接了很多垃圾电话,分享一下我的拦截方案。 首先我有一个主号,这是很多年前办的,银行、房贷等重要信息的电话,都是用的这个,不能换,但是由于办理时间长,很多垃圾电话和短信。 其次我有一个小号,所有的快递、外卖等电...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK