特点
后进先出
是一种受限的线性表,因为只能在栈顶操作
可以用数组或者链表实现,前者称为顺序栈,后者称为链式栈
**
常见应用场景
- 浏览器的前进后退
- 函数调用栈
- 表达式求值
- 括号匹配
练习题
思考
一: 功能上讲,数组和链表可以替代栈。那为什么还有栈存在的原因呢
二:为什么函数调用要用“栈”来保存临时变量呢?用其他数据结构不行吗?
栈后进先出的特点,函数作用域
三:我们都知道,JVM 内存管理中有个“堆栈”的概念。栈内存用来存储局部变量和方法调用,堆内存用来存储 Java 中的对象。那 JVM 里面的“栈”跟我们这里说的“栈”是不是一回事呢?如果不是,那它为什么又叫作“栈”呢?
参考一:引用课后讨论
内存管理上的“栈”和数据结构上的“栈”到底是不是一回事。
我简单翻了翻三大本厚书《C#图接教程》、《算法》、《深入理解计算机基础》,回答是“不是”
1、首先,在内存管理和数据结构上,都有“堆”和“栈”这两个概念。
2、内存管理上的“堆”和“栈”,强调的是数据的生命周期(分配释放是否有次序要求);数据结构上的“堆”和“栈”,强调的是数据的组织。
3、内存管理上的“栈”符合数据结构的“栈”的特点,即LIFO,两者同名可以接受。
4、数据结构上的“堆”定义:它是一种数组对象,它可以被视为一科完全二叉树结构;应用场景包括堆排序,优先队列等。和内存管理的“堆”定义不同(这里我不是很确定,没有看过内存管理上堆的实现细节)。
参考:
(1)数据结构之“堆”:http://www.cnblogs.com/Jason-Damon/archive/2012/04/18/2454649.html
(2)专题 | 堆、栈简介:https://zhuanlan.zhihu.com/p/45597548
(3)知乎| 为什么c++中要分为heap(堆)和stack(栈)? - Milo Yip的回答:https://www.zhihu.com/question/281940376/answer/424990646
参考二:引用课后讨论
内存中的堆栈和数据结构堆栈不是一个概念,可以说内存中的堆栈是真实存在的物理区,数据结构中的堆栈是抽象的数据存储结构。
内存空间在逻辑上分为三部分:代码区、静态数据区和动态数据区,动态数据区又分为栈区和堆区。
代码区:存储方法体的二进制代码。高级调度(作业调度)、中级调度(内存调度)、低级调度(进程调度)控制代码区执行代码的切换。
静态数据区:存储全局变量、静态变量、常量,常量包括final修饰的常量和String常量。系统自动分配和回收。
栈区:存储运行方法的形参、局部变量、返回值。由系统自动分配和回收。
堆区:new一个对象的引用或地址存储在栈区,指向该对象存储在堆区中的真实数据。
