跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C算法

C 语言手动实现栈结构:入栈与出栈详解

C 语言基于链表的手动栈实现方案。包含初始化、判空、入栈(PUSH)、出栈(POP)核心接口,以及主函数测试流程。通过指针操作演示内存分配与释放逻辑,适合理解底层数据结构原理及内存管理细节,无第三方库依赖。

SecGuard发布于 2025/1/21更新于 2026/10/278 浏览
C 语言手动实现栈结构:入栈与出栈详解

C 语言手动实现栈结构:入栈与出栈详解

栈(Stack)是线性表中一种重要的数据结构,遵循'后进先出'(LIFO)原则。在实际开发中,有时我们需要脱离标准库,手动构建一个轻量级的栈结构来适应特定需求。下面分享一个经典的 C 语言版本实现,采用单链表作为底层存储,重点展示指针操作与内存管理。

头文件设计

首先定义栈的结构体及接口声明。这里使用 struct stack 包含数据域和指向下一个节点的指针。

#ifndef _1_H
#define _1_H

#ifdef __cplusplus
extern "C" {
#endif

#define TRUE 1
#define FALSE 0

// 结构体定义
typedef struct stack
{
    int score;
    struct stack *next;
}STACK;

STACK *initStack(STACK *t);
int EMPTY(STACK *t);
STACK *PUSH(STACK *t,int x);
STACK *POP(STACK *t,int *x);

#ifdef __cplusplus
}
#endif

核心实现逻辑

接下来看具体的函数实现。初始化时只需将头指针置空;判空则检查头指针是否为 NULL。

#include <stdio.h>
#include <stdlib.h>
#include "1.h"

STACK *initStack(STACK *t)
{
    t = NULL;
    return t;
}

int EMPTY(STACK *t)
{
    return ((NULL == t) ? TRUE : FALSE);
}

入栈操作(PUSH)需要动态分配内存。注意检查 malloc 是否成功,防止内存不足导致程序崩溃。新节点插入头部,并更新头指针。

STACK *PUSH(STACK *t,int x)
{
    STACK *p;
    p = (STACK *)malloc(sizeof(STACK));
    if(NULL == p)
    {
        printf("memory error\n");
        return NULL;
    }
    p->score = x;
    p->next = t;
    return p;
}

出栈操作(POP)相对复杂些。需要先保存当前头节点,读取数据,然后移动头指针,最后释放旧节点内存。这里有个细节:函数返回新的头指针,调用者必须接收这个返回值才能正确维护栈顶状态。

STACK *POP(STACK *t,int *x)
{
    STACK *p;
    if(NULL == t)
    {
        printf("underflow\n");
        return NULL;
    }
    else
    {
        *x = t->score;
        p = t;
        t = t->next;
        free(p);
        return t;
    }
}

测试验证

最后在主函数中模拟压入一组数据,再依次弹出,观察顺序是否符合预期。

int main()
{
    int a[]={50,80,70,90},b[4]={0};
    int i,score,flag;
    STACK *top;
    top = initStack(top);
    flag = EMPTY(top);
    printf("-----------------------------\n");
    printf("this stack's empty flag is %d\n",flag);
    printf("-----------------------------\n");
    printf("PUSH:\n");
    for(i =0;i < 4;i++)
    {
        printf("%d\n",a[i]);
        top = PUSH(top, a[i]);
    }
    flag = EMPTY(top);
    printf("-----------------------------\n");
    printf("this stack's empty flag is %d\n",flag);
    printf("-----------------------------\n");
    printf("POP:\n");
    for(i =0;i < 4;i++)
    {
        top = POP(top, &b[i]);
        printf("%d\n",b[i]);
    }
    flag = EMPTY(top);
    printf("-----------------------------\n");
    printf("this stack's empty flag is %d\n",flag);
    printf("-----------------------------\n");
    top =NULL;
    return 0;
}

总结

这段代码虽然简单,但涵盖了栈操作的核心要点。实际使用时,建议增加错误处理机制,比如更详细的日志或异常抛出。另外,确保每次 malloc 都有对应的 free,避免内存泄漏。对于初学者来说,理解指针在函数间的传递与返回是掌握此类实现的关键。

目录

  1. C 语言手动实现栈结构:入栈与出栈详解
  2. 头文件设计
  3. 核心实现逻辑
  4. 测试验证
  5. 总结

更多推荐文章

查看全部
  • Python 抽象类与接口实现指南
  • Prometheus + Grafana 实现 Java 应用数据监控系统
  • AI 产品经理晋升路线图:从入门到精通的进阶指南
  • Neo4j 图数据库核心知识与在线控制台使用指南
  • 通达信 API 与 Python 构建量化交易系统实战
  • 《Agent Runtime 工程化》第六章 MCP 与 Provider 抽象:6.6 动手任务
  • FPGA 实现 CAN 总线接口与数据帧解析
  • 2026 年医疗 AI 可信革命全栈实现(上)
  • 开源模型 Prompt 实验报告:Mistral 与 Qwen 对比分析
  • 基于 WebGIS 的身份证首位数字与六大区域可视化展示
  • ComfyUI 集成 Stable Diffusion 3.5 FP8 全流程实测,出图速度提升 50%
  • STM32 上运行 AI 模型的四种方案及案例解析
  • 在 CentOS 7.9 上安装 OpenClaw:完整指南
  • 高并发场景下 Java 与 Go 的区别及 Channel 机制详解
  • 专业人士如何利用大模型优化诊断、推理与治疗流程
  • 医疗 AI 场景下的模型融合与集成策略
  • 用 Python 实现会追着食物跑的 AI 贪吃蛇
  • JavaScript 基础语法与核心概念详解
  • OpenFang深度体验:Rust驱动的Agent OS本土落地
  • ModelSim 仿真软件安装与使用指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online