当前位置:实例文章 » 其他实例» [文章]11 - 堆栈 - 堆栈

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 解析和逆波兰表达式的求值。堆栈的优点包括高效和空间效率,但也有一些缺点,如难以实现和容易溢出。

相关标签:
其他信息

其他资源

Top