首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言实现栈的push和pop操作 | 详解+源码

C语言实现栈的push和pop操作 | 详解+源码

作者头像
C语言中文社区
发布2025-10-11 13:28:10
发布2025-10-11 13:28:10
16000
代码可运行
举报
文章被收录于专栏:C语言中文社区C语言中文社区
运行总次数:0
代码可运行

推荐阅读

企业级开发 | C语言实现base64编码解码 | 附完整源码

优化C语言代码的11种实用方法

一位老程序员的忠告:别想着靠技术生存一辈子

收藏夹吃灰版!汇编语言快速入门(非常详细)

看不懂代码?带你回顾单片机常用C语言知识点

正文

一、栈的基本概念

在讲解代码前,我们先理解什么是“栈”。栈是一种特殊的“线性数据结构”,它的核心特点是“后进先出”(LIFO,Last In First Out)。 可以把栈想象成一摞盘子:

  • 新盘子只能放在最上面(这就是“入栈”,对应push操作);
  • 取盘子时也只能从最上面拿(这就是“出栈”,对应pop操作);
  • 最上面的盘子就是“栈顶”,没有盘子时就是“空栈”,盘子放满了就是“栈满”。

二、代码整体结构

我们用数组实现栈(数组实现简单直观,适合初学者理解),代码包含以下部分:

  1. 定义栈的结构体(存储栈的核心信息);
  2. 创建栈的函数(初始化栈);
  3. 入栈操作(push);
  4. 出栈操作(pop);
  5. 测试代码(验证功能)。

三、完整代码实现

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <stdlib.h>  // 用于动态内存分配(malloc、free)

// 1. 定义栈的结构体
typedefstruct {
    int* data;       // 用数组存储栈的元素
    int top;         // 栈顶指针(记录栈顶元素的位置,初始为-1表示空栈)
    int capacity;    // 栈的最大容量(最多能存多少元素)
} Stack;

// 2. 创建栈(初始化栈)
Stack* createStack(int capacity) {
    // 为栈结构体分配内存
    Stack* stack = (Stack*)malloc(sizeof(Stack));
    if (stack == NULL) {
        printf("内存分配失败!\n");
        returnNULL;
    }
    // 初始化栈的容量
    stack->capacity = capacity;
    // 初始化栈顶指针(空栈时栈顶为-1)
    stack->top = -1;
    // 为存储元素的数组分配内存(大小为capacity)
    stack->data = (int*)malloc(stack->capacity * sizeof(int));
    if (stack->data == NULL) {
        printf("数组内存分配失败!\n");
        free(stack);  // 释放已分配的栈结构体内存
        returnNULL;
    }
    returnstack;
}

// 3. 入栈操作(push):将元素放入栈顶
void push(Stack* stack, int item) {
    // 先检查栈是否已满(栈顶指针等于最大索引时满)
    if (stack->top == stack->capacity - 1) {
        printf("栈已满,无法入栈!\n");
        return;
    }
    // 栈顶指针+1(移动到新的栈顶位置),再存入元素
    stack->data[++stack->top] = item;
    printf("元素 %d 入栈成功\n", item);
}

// 4. 出栈操作(pop):从栈顶取出元素
int pop(Stack* stack) {
    // 先检查栈是否为空(栈顶指针为-1时为空)
    if (stack->top == -1) {
        printf("栈为空,无法出栈!\n");
        return-1;  // 用-1表示出栈失败(实际场景可根据需求调整)
    }
    // 先取出栈顶元素,再将栈顶指针-1(栈顶下移)
    int item = stack->data[stack->top--];
    printf("元素 %d 出栈成功\n", item);
    return item;
}

// 测试代码
int main() {
    // 创建一个容量为3的栈(最多存3个元素)
    Stack* stack = createStack(3);
    
    // 测试入栈
    push(stack, 10);  // 栈顶变为0,存储10
    push(stack, 20);  // 栈顶变为1,存储20
    push(stack, 30);  // 栈顶变为2,存储30
    push(stack, 40);  // 此时栈已满,会提示"栈已满"
    
    // 测试出栈
    pop(stack);  // 取出30,栈顶变为1
    pop(stack);  // 取出20,栈顶变为0
    pop(stack);  // 取出10,栈顶变为-1(空栈)
    pop(stack);  // 此时栈为空,会提示"栈为空"
    
    // 释放内存(避免内存泄漏)
    free(stack->data);
    free(stack);
    return0;
}

四、代码详解

1. 栈的结构体(Stack

结构体是栈的“骨架”,包含3个核心成员:

  • int* data:动态数组,用于实际存储栈的元素(用动态数组是为了让栈的容量可自定义);
  • int top:栈顶指针(本质是数组索引),记录当前栈顶元素的位置。初始值为-1(因为数组索引从0开始,-1表示“没有元素”,即空栈);
  • int capacity:栈的最大容量(比如capacity=3,表示最多能存3个元素)。

2. 创建栈(createStack函数)

作用:初始化一个栈,为栈和存储元素的数组分配内存。 步骤:

  1. mallocStack结构体分配内存(如果分配失败,提示错误并返回NULL);
  2. 设置栈的最大容量(capacity);
  3. 初始化栈顶指针(top = -1,表示空栈);
  4. data数组分配内存(大小为capacity * sizeof(int)),如果失败则释放已分配的结构体内存(避免内存泄漏)。

3. 入栈操作(push函数)

作用:将元素添加到栈顶。 核心逻辑:

  • 先检查栈是否已满:栈满的条件是 top == capacity - 1(因为数组最大索引是capacity-1,比如capacity=3时,最大索引是2)。如果满了,提示“栈已满”;
  • 如果没满:先将top加1(移动到新的栈顶位置),再将元素存入data[top](比如第一次入栈时,top从-1变为0,元素存在data[0])。

4. 出栈操作(pop函数)

作用:从栈顶取出元素并移除。 核心逻辑:

  • 先检查栈是否为空:空栈的条件是 top == -1(没有元素)。如果为空,提示“栈为空”并返回-1;
  • 如果不为空:先取出data[top](栈顶元素),再将top减1(栈顶下移,相当于移除元素),最后返回取出的元素。

5. 测试代码(main函数)

我们创建了一个容量为3的栈,测试流程:

  • 入栈10、20、30(此时栈满);
  • 尝试入栈40(失败,提示“栈已满”);
  • 出栈30、20、10(此时栈空);
  • 尝试出栈(失败,提示“栈为空”);
  • 最后释放内存(free),避免内存泄漏。

五、运行结果

image
image

image

六、总结

  1. 栈的核心是“后进先出”,pushpop都只能操作栈顶元素;
  2. 数组实现栈时,用top指针记录栈顶位置,capacity限制最大容量;
  3. push前必须检查栈满,pop前必须检查栈空(否则会越界访问数组,导致程序崩溃);
  4. 实际开发中,栈的元素类型可以是charfloat等,只需修改结构体中data的类型即可。

通过这个实现,我们可以清晰地理解栈的基本操作原理,为后续学习更复杂的数据结构打下基础。

--完--

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言中文社区 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 推荐阅读
  • 正文
    • 一、栈的基本概念
    • 二、代码整体结构
    • 三、完整代码实现
    • 四、代码详解
      • 1. 栈的结构体(Stack)
      • 2. 创建栈(createStack函数)
      • 3. 入栈操作(push函数)
      • 4. 出栈操作(pop函数)
      • 5. 测试代码(main函数)
    • 五、运行结果
    • 六、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档