【C数据结构】栈_Stack

news2024/12/26 22:33:32

目录

栈_Stack

【1】栈的概念及结构

【2】栈的实现

【1.1】栈数据结构的接口

【1.2】栈的初始化

【1.3】栈的释放

【1.4】入栈

【1.5】出栈

【1.6】获取栈顶数据

【1.8】获取栈中的有效元素个数

【1.9】检测栈是否为空


栈_Stack

【1】栈的概念及结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

栈:后进先出(Last In Firsh Out)

【2】栈的实现

        栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

        如果有特定场合要用链表作为栈的实现,那我们应该将头和尾巴翻过来,示意图:

【1.1】栈数据结构的接口

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

// 栈数据结构定义 ///
/* 栈数据结构 */
typedef int STDataType;
typedef struct Stack {
    STDataType* _buffer;
    size_t _top;
    size_t _capacity;
}ST;


// 栈常用接口定义 ///
/* 栈:初始化 */
void StackInit(ST* pSt);

/* 栈:销毁 */
void StackDestory(ST* pSt);

/* 栈:入栈 */
void StackPush(ST* pSt, STDataType val);

/* 栈:出栈 */
void StackPop(ST* pSt);

/* 栈:获取栈顶数据 */
STDataType StackTop(ST* pSt);

/* 栈:获取栈中有效元素个数 */
size_t StackSize(ST* pSt);

/* 栈:检查是否为空栈 */
bool StackEmpty(ST* pSt);

【1.2】栈的初始化

/* 栈:初始化 */
void StackInit(ST* pSt) {
    // 断言
    assert(pSt);

    // 初始化
    pSt->_buffer = NULL;
    pSt->_top = pSt->_capacity = 0;
}

【1.3】栈的释放

/* 栈:销毁 */
void StackDestory(ST* pSt) {
    // 断言
    assert(pSt);

    // 销毁内存,初始化变量
    free(pSt->_buffer);    pSt->_buffer = NULL;
    pSt->_top = pSt->_capacity = 0;
    pSt = NULL;
}

【1.4】入栈

入栈动图演示

入栈的两种情况

/* 栈:入栈 */
void StackPush(ST* pSt, STDataType val) {
    // 断言
    assert(pSt);

    // 检查容量
    if (pSt->_top == pSt->_capacity) {
        size_t newCapacity = pSt->_capacity == 0 ? 4 : pSt->_capacity * 2;
        STDataType* pTemp = (STDataType*)realloc(pSt->_buffer, sizeof(STDataType) * newCapacity);
        // 开辟失败
        if (pTemp == NULL) {
            perror("realloc fail!");
            exit(-1);
        }

        // 开辟成功
        pSt->_buffer = pTemp; pTemp = NULL;
        pSt->_capacity = newCapacity;
    }

    // 数据入栈
    pSt->_buffer[pSt->_top] = val;
    pSt->_top++;
}

【1.5】出栈

出栈动图演示

/* 栈:出栈 */
void StackPop(ST* pSt) {
    // 断言
    assert(pSt);
    assert(!StackEmpty(pSt));

 pSt->_top--;
}

【1.6】获取栈顶数据

/* 栈:获取栈顶数据 */
STDataType StackTop(ST* pSt) {
    // 断言
    assert(pSt);
    assert(!StackEmpty(pSt));

    return pSt->_buffer[pSt->_top - 1];
}

【1.8】获取栈中的有效元素个数

/* 栈:获取栈中有效元素个数 */
size_t StackSize(ST* pSt) {
    // 断言
    assert(pSt);

    return pSt->_top;
}

【1.9】检测栈是否为空

/* 栈:检查是否为空栈 */
bool StackEmpty(ST* pSt) {
    // 断言
    assert(pSt);

    return pSt->_top == 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/663629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

程序员自学能找到工作吗?

程序员是一个非常热门的职业&#xff0c;很多人都想成为一名优秀的程序员。但是&#xff0c;要成为一名程序员&#xff0c;需要学习哪些知识和技能呢&#xff1f;是否一定要上大学或者参加培训班才能学习编程呢&#xff1f;自学编程是否可行呢&#xff1f;自学编程的人能否找到…

山东泰安电力学校,华为ensp考试

文章目录 一、考试要求二、作者的拓扑图&#xff0c;作者的x27&#xff0c;y5三、每个设备的代码&#xff08;可直接复制粘贴运行&#xff0c;端口和连线要一样&#xff09;SW1SW2R0R1R2 四、每个部分的有运行截图SW1SW2R0R1R2 五、运行成功截图 一、考试要求 考试初始化文件下…

马克思期末复习 第一章

目录 第一节 1.物质和意识 2.主观能动性和客观规律 3.运动与静止 第二节 第一节 1.物质和意识 总括&#xff1a;物质决定意识&#xff0c;任何事情都要从实际出发&#xff0c;实事求是 意识的能动作用&#xff1a; 1.意识反作用于物质&#xff0c;好的意识推动物质发展&am…

AI Chat 设计模式:3. 原型模式

本文是该系列的第三篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的旁白。 问题列表 Q.1 今天我们聊一下原型模式吧A.1Q.2 那写一个实现了深拷贝的例子A.2Q.3 你这里为什么要对构造函数进…

【敬伟ps教程】图层进阶知识

文章目录 图层过滤和锁定图层链接图层编组图层合并图层盖印图层复合图层剪贴蒙版 图层过滤和锁定 图层过滤可以根据图层不同的性质进行查看管理 图层锁定即是对图层或图层某部分进行操作保护 按钮分别为&#xff1a; 锁定透明像素&#xff1a;禁止对透明区域进行操作 锁…

写给刚进互联网圈子的人,不管你是开发,测试,产品,运维都适用

1、技术没那么值钱&#xff0c;真正值钱的是技术背后的商业模式&#xff0c;更好地满足市场需求才是重点。 所以不要排斥技术以外的东西&#xff0c;我们要做的&#xff0c;是以技术进入这个行业立足&#xff0c;然后找到适合自己的定位&#xff0c;深耕下去&#xff0c;把自己…

Alibaba Sentinel | 流控规则设置

文章目录 一、Sentinel概述强大的优势&#xff1a;组成部分&#xff1a; 二、微服务集成Sentinel版本说明安装Sentinel控制台&#xff1a;1、docke安装2、jar安装启动控制台 微服务集成Sentinel&#xff1a;查看控制台监控数据 三、流控规则详解流量控制概述什么是流控规则原理…

接口自动化测试中的用例编写问题总结

目录 01sql语句内容出现错误 02sql语句格式错误 03断言返回数据的类型 04业务逻辑覆盖判断 05一些具体业务需求需要封装api 总结&#xff1a; 本篇文章分享几个接口自动化用例编写过程遇到的问题总结&#xff0c;希望能对初次探索接口自动化测试的小伙伴们解决问题上提供一…

程序员需要达到什么水平才能不被性别歧视?顺利拿到 20k 无压力?

被歧视&#xff0c;不存在&#xff1f; 我是女生&#xff0c;大三&#xff0c;却没人这样对我&#xff0c;因为我从来都是队长!谁敢砍我代码他试试!我就把他砍掉!而且&#xff0c;我写的代码他们很少能看懂&#xff0c;因为我一般都写算法或者一个项目里比较难的部分&#xff…

网络管理与维护(一)

这里写自定义目录标题 管理站网络管理系统组成代理网络管理协议管理信息库 网络管理的功能故障管理配置管理计费管理性能管理安全管理 总结 管理站 网络管理系统组成 代理 代理&#xff08;Agent&#xff09;位于被管理对象中&#xff0c;被管理对象可以是计算机、网络设备&a…

【云原生】云原生架构

文章目录 背景一、云原生二、云原生简介三、三大技术基石3.1、基础设施即代码3.2、不可变基础设施3.3、声明式API 四、云原生的优点4.1、加速软件开发周期4.2、更快的上市时间4.3、高可用性与弹性4.4、更低的成本4.5、将应用程序转变为API 五、云原生架构模式特点详解5.1、现收…

SQL数据库防挂科

注&#xff1a;本篇文章的图片等内容来自B站UP主&#xff1a;编程张无忌 一、绪论 二、关系数据库 三、SQL上 1、模式的定义和删除 单纯定义一个模式&#xff1a; create schema "S-T" authorizationg WANG 定义模式 表/视图/授权 任意一个来描述(创建一个tab…

22JS13——简单类型与复杂类型

文章目录 一、简单类型与复杂类型二、堆和栈三、简单类型的内存分配四、复杂类型的内存分配五、简单类型传参六、复杂类型传参 目标&#xff1a; 1、简单类型与复杂类型 2、堆和栈 3、简单类型的内存分配 4、复杂类型的内存分配 5、简单类型传参 6、复杂类型传参 一、简单类型与…

selenium爬虫运行慢如何解决?

Selenium作为一个强大的自动化工具&#xff0c;可用于编写爬虫程序&#xff0c;尽管Selenium在处理动态网页上非常强大&#xff0c;但对于静态网页爬简单数据提取&#xff0c;使用轻量级库或工具可能更加上所述&#xff0c;Selenium作为一个灵活可定动化工具&#xff0c;在需要…

如何正确使用DTM的Saga模式

DTM 简介 前面章节提及的MassTransit、dotnetcore/CAP都提供了分布式事务的处理能力&#xff0c;但也仅局限于Saga和本地消息表模式的实现。那有没有一个独立的分布式事务解决方案&#xff0c;涵盖多种分布式事务处理模式&#xff0c;如Saga、TCC、XA模式等。有&#xff0c;目…

真正的网工大佬,到底是什么样的?

大家好&#xff0c;我是许公子。 关于到底真正的网工大佬是什么样的&#xff0c;众说纷纭。 刚刚入行的小朋友&#xff0c;可能会觉得&#xff0c;是不是有HCIE的就算是网工大佬啊&#xff1f; 来几个老网工&#xff0c;评论区给他上一课哈哈。 就用这个点&#xff0c;跟你…

5年测试路,在字节终于爬到了半山腰,我不想被淘汰......

软件测试是一个付出就有回报的工作&#xff0c;可能很多人会说软件测试就是吃青春饭&#xff0c;然而其他工作又何尝不是&#xff1f;没有哪一家公司养尸位素餐之人&#xff0c;大龄员工有被辞退的&#xff0c;也有没被辞退的。干任何职业&#xff0c;抱着一劳永逸的心态&#…

MySQL----日志查询、备份与恢复

文章目录 一、MySQL日志管理二、MySQL 完全备份与恢复2.1备份的重要性2.2数据库备份的分类从物理与逻辑的角度从数据库的备份策略角度完全备份 三、MySQL 完全备份与恢复实验3.1物理冷备份与恢复3.2使用MySQL dump工具进行恢复备份恢复数据 3.3增量备份恢复 一、MySQL日志管理 …

LeetCod刷题笔记

目录 2739.总行驶距离 思路&#xff1a;模拟 代码 6890.找出分区值 思路&#xff1a;急转弯 代码: 1254.统计封闭岛屿的数目​编辑 思路&#xff1a;DFS 代码&#xff1a; 6447.给墙壁刷油漆 思路&#xff1a;动态规划 代码&#xff1a; 思路&#xff1a;状态DP 代码&…

Mac配置Android addr2line环境变量以及使用

1.首先进入终端 2.下面这个指令进入vim编辑器&#xff0c;就可以修改环境变量 vim ./.bash_profile3.按i进入insert模式 4.输入路径&#xff1a; arm32: export PATH${PATH}:/Users/xianquan/Library/Android/sdk/ndk/21.1.6352462/toolchains/arm-linux-androideabi-4.9/p…