C语言实现自动扩容顺序栈ArrStack代码示例

2 下载量 47 浏览量 更新于2024-09-02 收藏 142KB PDF 举报
"C语言实现了一个自动扩容的顺序结构栈,名为ArrStack,适用于GCC编译环境。这个栈包括创建、销毁、清空、获取高度、获取大小、判断空栈、压栈、出栈、获取栈顶元素以及遍历栈内元素等基本操作。" 在C语言中,栈是一种非常基础且重要的数据结构,它遵循“后进先出”(LIFO)的原则。顺序栈是栈的一种实现方式,其中元素存储在一块连续的内存区域中。在这个实现中,ArrStack 结构体包含了栈底(btm)、栈顶(top)、栈高(height)以及栈的总大小(size)。同时,栈的元素类型是 `ElemType`,定义为包含两个整型成员(x 和 y)的 `struct Point2D`。 以下是对ArrStack栈结构体及其相关操作的详细解释: 1. **创建栈**: `ArrStack* CreateStack(int nSize)` 函数用于创建一个大小为 nSize 的栈。它会分配足够的内存来存储 nSize 个 `ElemType` 对象,并初始化栈顶指针 top 为栈底指针 btm,栈高为 0。 2. **销毁栈**: `void DestroyStack(ArrStack* pStack)` 函数释放由 CreateStack 分配的内存,以防止内存泄漏。 3. **清空栈**: `void ClearStack(ArrStack* pStack)` 函数将栈内的所有元素置为空,但并不释放内存。栈顶指针 top 会回到栈底 btm。 4. **获取栈高度和大小**: `int GetHeight(ArrStack* pStack)` 返回栈的高度,即栈中的元素数量。 `int GetSize(ArrStack* pStack)` 返回栈的总容量,即在创建时分配的元素数量。 5. **判断空栈**: `int IsEmpty(ArrStack* pStack)` 检查栈是否为空,如果 top 等于 btm,则返回 TRUE,表示为空栈;否则返回 FALSE。 6. **压栈**: `int Push(ArrStack* pStack, ElemType* pt)` 将元素 pt 压入栈顶。如果栈已满(top 接近 size),则可能需要进行扩容操作,例如分配新的内存块并复制旧元素。 7. **出栈**: `int Pop(ArrStack* pStack, ElemType* pt)` 将栈顶元素弹出到 pt。如果栈为空,返回错误。 8. **获取栈顶元素**: `int GetTop(ArrStack* pStack, ElemType* pt)` 获取栈顶元素的副本到 pt,但不删除该元素。如果栈为空,返回错误。 9. **遍历栈内元素**: `void ForEachStack(ArrStack* pStack, void(*func)(ElemType* pt))` 从栈底到栈顶遍历每个元素,对每个元素调用用户提供的函数 func。 `void ReForEachStack(ArrStack* pStack, void(*func)(ElemType* pt))` 与上相同,但遍历顺序是从栈顶到栈底。 这个实现没有包含自动扩容的具体逻辑,但在实际应用中,当栈满时,通常需要动态地调整栈的大小,比如通过分配更大的内存块并将现有元素复制过去。这可以通过检查 `top - btm` 是否接近 `size` 来实现,如果接近,则重新分配一个更大容量的内存块,并将原有元素复制过去。 此外,为了确保程序的健壮性,还需要添加错误处理机制,例如在分配内存失败时抛出异常,或者在栈操作过程中检查边界条件,避免非法访问内存。