SYS.READ_STREAM | UTF-8
PATH: Appendix/01-栈.md
WORDS:532
EST_TIME:2 MIN

#1 栈的概念

本章将介绍栈与调用栈的概念,这将帮助读者更好地理解方块更新。

栈(Stack) 是一种 先进后出(FILO, First In Last Out) 的数据结构,它的特点是:元素只能在表的一端被操作。

想象一个 薯片桶

  • 薯片只能从桶口放入,也只能从桶口拿出。
  • 因此,最先放入桶底的那片薯片,将会是最后才能拿出来的

这就是“先进后出”的概念。

栈即是一个薯片桶。
而在数据结构的术语里:

  • “往桶里放薯片”对应 压入栈(Push)
  • “从桶口取薯片”对应 弹出栈(Pop)

此外:

  • 桶口 就相当于 栈顶(Top)
  • 桶底 则相当于 栈底(Bottom)

这便是栈的概念。

调用栈(Call Stack) 是程序在运行时管理函数调用的一种机制,它依赖栈的“先进后出”规则来保证函数能够正确返回。

想象你打电话问问题:

  1. 你打电话给朋友 A,询问一个问题。
  2. A 不知道答案,于是他打电话询问他的朋友 B。
  3. B 也不清楚,再去询问问朋友 C。

这次,C 找到了答案,他先告诉 B;
B 再将答案告诉 A;
最后 A 将答案告诉你。

这里的顺序就是 调用栈的行为

  • 每一次电话都向“调用栈”中压入一个新的“调用任务”。
  • C 寻找答案时,栈顶的任务就是“C寻找答案”。
  • C 找到答案后,最后被调用的任务最先完成,然后逐层返回给调用者(B → A → 你)。
  • 而你最初的电话,是最先压入调用栈的任务,因此它位于栈底

而在程序中:

  • “打电话” 相当于 调用函数
  • “得到答案并回传” 相当于 函数返回结果

这样,程序便可以在函数嵌套调用时,确保每个函数都能完成并正确返回到调用点。