码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数据结构 —— 栈(超详细图解 & 接口函数实现)


    系列文章目录

    数据结构 —— 顺序表
    数据结构 —— 单链表
    数据结构 —— 双向链表
    数据结构 —— 栈


    文章目录

    • 系列文章目录
    • 前言
    • 一、示例问题:弹匣供弹
      • 1.弹匣供弹原理
      • 2.逻辑示意图
      • 3.栈的引入
    • 二、栈的概念
      • 1.定义
      • 2.结构
      • 3.存储
    • 三、栈的接口函数
      • 1.初始化栈
      • 2.空栈判断
      • 3.入栈(压栈)
      • 4.出栈(弹栈)
      • 5.栈顶元素
      • 6.栈的元素个数
      • 7.栈的销毁
    • 四、总结


    前言

    数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。数据结构是一种十分优秀的解决实际问题的模板,是先进思想的结晶。博主将会用代码结合大量图解,对数据结构进行深度剖析,以便大家更好的学习数据结构的思想。


    一、示例问题:弹匣供弹

    1.弹匣供弹原理

    在最上面的子弹是最后被压入,也是最先被射出的

    请添加图片描述

    2.逻辑示意图

    先入后出,后入先出

    弹匣里的子弹在被压入时的顺序和被射出时的顺序正好相反,最先被压入的子弹在最后一个位置,同时也是最后被射出,而最后被压入的子弹在最上面的位置,也是最先被射出。

    请添加图片描述

    3.栈的引入

    栈的引入:先入后出,后入先出的数据结构

    二、栈的概念

    1.定义

    栈(stack):栈是限定仅在表尾进行插入和删除操作的线性表

    我们通常把插入和删除的一端称为栈顶(top),相反的另一端称为栈底(bottom),而不含任何元素的栈则称为空栈。栈又可以称为后进先出(Last In First Out)的线性表,简称LIFO结构。

    2.结构

    栈的结构类型

    //类型
    typedef int STDataType;
    //栈结构
    typedef struct Stack {
        STDataType *array;  // 数组
        int top;            // 栈顶
        int capacity;       // 容量
    } Stack;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.存储

    存储:用动态开辟的一维数组来实现顺序表的存储结构

    由于只需要对栈顶元素进行操作,所以可以使用顺序表的物理结构,来实现堆的逻辑结构的操作。

    在这里插入图片描述

    三、栈的接口函数

    1.初始化栈

    对顺序表的内容进行初始设置

    // 初始化栈
    void StackInit(Stack *pst) {
        assert(pst);
        pst->array = (STDataType *)malloc(4 * sizeof(STDataType));
        pst->top = 0;
        pst->capacity = 4;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.空栈判断

    判断一个栈是否为空

    // 检测栈是否为空,空(true),非空返回(false)
    bool StackEmpty(Stack *pst) {
        assert(pst);
        return pst->top == 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.入栈(压栈)

    栈的插入操作

    // 入栈
    void StackPush(Stack *pst, STDataType data) {
        assert(pst);
        if (pst->top == pst->capacity) {
            STDataType *newSpace = (STDataType *)realloc(pst->array, sizeof(STDataType) * pst->capacity * 2);
            if (newSpace == NULL) {
                perror("realloc fail:");
            }
            pst->array = newSpace;
            pst->capacity *= 2;
        }
        pst->array[pst->top] = data;
        pst->top++;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    4.出栈(弹栈)

    栈的删除操作

    // 出栈
    void StackPop(Stack *pst) {
        assert(pst);
        assert(!StackEmpty(pst));
        pst->top--;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    5.栈顶元素

    获取栈顶部存储的元素

    // 获取栈顶元素
    STDataType StackTop(Stack *pst) {
        assert(pst);
        assert(!StackEmpty(pst));
        return pst->array[pst->top - 1];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    6.栈的元素个数

    // 获取栈中有效元素个数

    // 获取栈中有效元素个数
    int StackSize(Stack *pst) {
        assert(pst);
        return pst->top;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    7.栈的销毁

    释放栈申请的空间

    // 销毁栈
    void StackDestroy(Stack *pst) {
        assert(pst);
        free(pst->array);
        pst->array = NULL;
        pst->capacity = pst->top = 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7


    四、总结

    栈是解决实际问题时极其常用的一种数据结构,是非常重要的解决问题的方式。栈的各种接口的复现,有利于更好的学习数据结构的思想,有利于开阔视野,学习前辈的智慧结晶。对我们后续解决实际问题也会有很大帮助。

  • 相关阅读:
    【浅拷贝和深拷贝】,【堆和栈】,【基本类型和引用类型】
    婴儿摇铃玩具亚马逊审查要求做CPC认证标准要求
    LeetCode 21. 合并两个有序链表
    Python——Python程序的文件头部声明
    网络编程TCP/UDP通信
    Sass详解和应用
    Linux操作系统~进程地址空间
    洛谷P4345 超能粒子炮·改
    DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务
    ubuntu离线编译安装cmake 3.22.5(could not fonud OPENSSL) and cmake-versinon查不到版本问题
  • 原文地址:https://blog.csdn.net/qq_64589446/article/details/126259541
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号