#1 栈的概念
本章将介绍栈与调用栈的概念,这将帮助读者更好地理解方块更新。
#1.1 理解栈
栈(Stack) 是一种 先进后出(FILO, First In Last Out) 的数据结构,它的特点是:元素只能在表的一端被操作。
#1.1.1 先进后出
想象一个 薯片桶:
- 薯片只能从桶口放入,也只能从桶口拿出。
- 因此,最先放入桶底的那片薯片,将会是最后才能拿出来的。
这就是“先进后出”的概念。
#1.1.2 栈
栈即是一个薯片桶。
而在数据结构的术语里:
- “往桶里放薯片”对应 压入栈(Push);
- “从桶口取薯片”对应 弹出栈(Pop)。
此外:
- 桶口 就相当于 栈顶(Top)
- 桶底 则相当于 栈底(Bottom)
这便是栈的概念。
#1.2 调用栈的概念
调用栈(Call Stack) 是程序在运行时管理函数调用的一种机制,它依赖栈的“先进后出”规则来保证函数能够正确返回。
#1.2.1 调用栈
想象你打电话问问题:
- 你打电话给朋友 A,询问一个问题。
- A 不知道答案,于是他打电话询问他的朋友 B。
- B 也不清楚,再去询问问朋友 C。
这次,C 找到了答案,他先告诉 B;
B 再将答案告诉 A;
最后 A 将答案告诉你。
这里的顺序就是 调用栈的行为:
- 每一次电话都向“调用栈”中压入一个新的“调用任务”。
- C 寻找答案时,栈顶的任务就是“C寻找答案”。
- C 找到答案后,最后被调用的任务最先完成,然后逐层返回给调用者(B → A → 你)。
- 而你最初的电话,是最先压入调用栈的任务,因此它位于栈底。
而在程序中:
- “打电话” 相当于 调用函数;
- “得到答案并回传” 相当于 函数返回结果。
这样,程序便可以在函数嵌套调用时,确保每个函数都能完成并正确返回到调用点。