1. 内存分配中的堆栈 (Stack)
**定义:**堆栈是一种内存分配的区域,用于管理函数调用、局部变量和控制流。
它采用后进先出 (LIFO, Last In First Out) 的原则进行操作。
特点:
自动管理:由操作系统或编译器自动分配和释放。
高速访问:堆栈访问速度非常快,因为它是线性数据结构。
空间限制:大小固定(通常几 MB),可能会导致栈溢出。
用途:
存储局部变量。
存储函数调用的返回地址和参数。
管理递归调用。
示例:
void func() {
int x = 10; // 'x' 分配在堆栈上,函数结束时自动释放。
}
2. 内存分配中的堆 (Heap)
**定义:**堆是内存中的一个动态分配区域,用于存储程序运行期间需要的动态数据。
特点:
手动管理:需要程序员显式分配(如 malloc/new)和释放(如 free/delete)。
访问灵活:大小不固定,取决于系统内存和可用资源。
速度较慢:堆的分配和释放比堆栈慢。
用途:
存储动态分配的对象或数据。
实现复杂数据结构(如链表、树)。
示例:
int* p = (int*)malloc(sizeof(int)); // 'p' 指向堆上的内存,需要手动释放。
*p = 20;
free(p); // 释放堆内存。
3. 数据结构中的堆栈 (Stack)
定义:
堆栈是一种具体的线性数据结构,遵循后进先出 (LIFO) 原则。
特点:
支持的操作:push(入栈)和 pop(出栈)。
可用于管理函数调用、表达式求值等。
通常通过数组或链表实现。
示例:
stack = []
stack.append(1) # 入栈
stack.append(2) # 入栈
stack.pop() # 出栈,返回 2
4. 数据结构中的堆 (Heap)
定义:
堆是一种特殊的树形数据结构,常用于实现优先队列。
有两种类型:
最小堆 (Min-Heap):每个父节点的值小于或等于其子节点。
最大堆 (Max-Heap):每个父节点的值大于或等于其子节点。
特点:
用于快速获取最小值/最大值。
通常使用数组表示。
示例:
import heapq
heap = []
heapq.heappush(heap, 10) # 入堆
heapq.heappush(heap, 5) # 入堆
heapq.heappush(heap, 7) # 入堆
heapq.heappop(heap) # 出堆,返回最小值 5
类别 | 堆栈 (Stack) | 堆 (Heap) |
---|---|---|
内存分配 | 固定大小 ,自动管理 | 动态大小,手动管理 |
数据结构 | 线性结构,后进先出 (LIFO) | 树形结构,优先级排序 |
操作速度 | 快(直接通过指针) | 慢(需要动态分配) |
用途 | 局部变量、函数调用管理 | 动态分配对象、实现复杂数据结构 |