11 - 堆栈 - 堆栈
发布人:shili8
发布时间:2025-01-12 18:54
阅读次数:0
**堆栈**
堆栈是一种线性数据结构,类似于一个书架。它支持两种基本操作:入栈(push)和出栈(pop)。入栈是指将元素添加到栈顶,而出栈则是指从栈顶移除元素。
**堆栈的定义**
堆栈可以用数组或链表来实现。下面是一个使用数组实现的堆栈的例子:
ctypedef struct {
int* data;
int top; // 栈顶索引 int capacity; // 容量} Stack;
// 初始化堆栈void initStack(Stack* stack, int capacity) {
stack->data = (int*)malloc(sizeof(int) * capacity);
stack->top = -1;
stack->capacity = capacity;
}
// 入栈void push(Stack* stack, int value) {
if (stack->top == stack->capacity -1) {
// 栈满,需要扩容 stack->capacity *=2;
int* newData = (int*)malloc(sizeof(int) * stack->capacity);
for (int i =0; i <= stack->top; i++) {
newData[i] = stack->data[i];
}
free(stack->data);
stack->data = newData;
}
stack->data[++stack->top] = value;
}
// 出栈int pop(Stack* stack) {
if (stack->top == -1) {
// 栈空,无法出栈 return -1; // 或抛出异常 }
int value = stack->data[stack->top--];
free(stack->data);
stack->data = (int*)malloc(sizeof(int) * stack->capacity /2);
for (int i =0; i <= stack->top; i++) {
stack->data[i] = stack->data[i +1];
}
return value;
}
**堆栈的应用**
堆栈有很多应用场景,例如:
* **表达式求值**: 使用堆栈可以很容易地实现表达式求值。例如,表达式 `3+4*5` 可以使用堆栈来计算。
* **HTML解析**: HTML 解析器通常使用堆栈来存储 HTML 元素的结构信息。
* **逆波兰表达式**: 使用堆栈可以很容易地实现逆波兰表达式的求值。
**堆栈的优点**
堆栈有很多优点,例如:
* **高效**: 堆栈的入栈和出栈操作都是 O(1) 的。
* **空间效率**: 堆栈可以很容易地扩容或收缩来适应数据的大小。
**堆栈的缺点**
堆栈也有很多缺点,例如:
* **难以实现**: 堆栈的实现需要考虑到入栈和出栈操作的顺序和逻辑。
* **容易溢出**: 如果堆栈过度使用或没有适当扩容,可能会导致溢出。
**总结**
堆栈是一种线性数据结构,支持两种基本操作:入栈和出栈。它有很多应用场景,如表达式求值、HTML 解析和逆波兰表达式的求值。堆栈的优点包括高效和空间效率,但也有一些缺点,如难以实现和容易溢出。

