首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >动态开辟空间的数组栈的实现

动态开辟空间的数组栈的实现

作者头像
绝活蛋炒饭
发布2024-12-16 15:46:55
发布2024-12-16 15:46:55
1850
举报
文章被收录于专栏:绝活编程学习绝活编程学习

1.栈数据类型的定义

代码语言:javascript
复制
typedef int STDataType;  // 定义栈数据类型

typedef struct Stack  // 定义栈结构
{
    STDataType* arr;  // 指向栈的指针
    int _top;        // 栈顶
    int _capacity;   // 容量 
}Stack;

2.初始化栈

代码语言:javascript
复制
// 初始化栈 
void StackInit(Stack* ps)  // 初始化栈
{
    ps->arr = NULL;  // 将栈的指针设为空
    ps->_capacity = 0;  // 栈容量设为0
    ps->_top = 0;  // 栈顶设为0
}

3.销毁栈

代码语言:javascript
复制
// 销毁栈 
void StackDestroy(Stack* ps)  // 销毁栈
{
    assert(ps);  // 断言栈存在
    free(ps->arr);  // 释放栈的内存空间
    ps->arr = NULL;  // 将栈的指针设为空
    ps->_capacity = 0;  // 栈容量设为0
    ps->_top = 0;  // 栈顶设为0
}

4.入栈

代码语言:javascript
复制
// 入栈 
void StackPush(Stack* ps, STDataType data)  // 入栈操作
{
    if (ps->_top == ps->_capacity)  // 如果栈的元素个数等于栈的容量
    {
        ps->_capacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;  // 如果栈的容量为0,设为4;否则翻倍

        ps->arr = (STDataType*)realloc(ps->arr, sizeof(STDataType) * ps->_capacity);  // 重新分配内存空间

        if (ps->arr == NULL)  // 如果内存分配失败
        {
            perror("realloc");  // 打印错误信息
        }
    }
    ps->arr[ps->_top] = data;  // 将新元素入栈
    ps->_top++;  // 栈顶移动到新的位置
}

5.出栈

代码语言:javascript
复制
// 出栈 
void StackPop(Stack* ps)  // 出栈操作
{
    if (ps->_top > 0)  // 如果栈非空
    {
        ps->_top--;  // 栈顶向下移动
    }
    else
    {
        printf("栈内已经没有元素了");  // 如果栈为空,打印提示信息
    }
}

6.获取栈顶元素

代码语言:javascript
复制
// 获取栈顶元素 
STDataType StackTop(Stack* ps)  // 获取栈顶元素
{
    return ps->arr[ps->_top - 1];  // 返回栈顶元素的值
}

7.获取栈中有效元素个数

代码语言:javascript
复制
// 获取栈中有效元素个数 
int StackSize(Stack* ps)  // 获取栈中元素个数
{
    return ps->_top;  // 返回栈顶位置(即栈中元素个数)
}

8. 检测栈是否为空

代码语言:javascript
复制
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps)  // 检查栈是否为空
{
    if (ps->_top > 0)  // 如果栈非空
    {
        return ps->_top;  // 返回栈中元素个数
    }
    else
    {
        return 0;  // 如果栈为空返回0
    }
}

9.打印栈

代码语言:javascript
复制
//打印栈
void StackPrint(Stack* ps)  // 打印栈中元素
{
    int i = 0;  // 初始化循环变量
    for (i = 0; i < ps->_top; i++)  // 遍历栈中元素
    {
        printf("%d->", ps->arr[i]);  // 打印元素值
    }
    printf("NULL");  // 打印结束标志
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.栈数据类型的定义
  • 2.初始化栈
  • 3.销毁栈
  • 4.入栈
  • 5.出栈
  • 6.获取栈顶元素
  • 7.获取栈中有效元素个数
  • 8. 检测栈是否为空
  • 9.打印栈
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档