当前位置: 首页 > news >正文

数据结构之栈详解(C语言手撕)

在这里插入图片描述

在这里插入图片描述

🎉个人名片:

🐼作者简介:一名乐于分享在学习道路上收获的大二在校生
🙈个人主页🎉:GOTXX
🐼个人WeChat:ILXOXVJE
🐼本文由GOTXX原创,首发CSDN🎉🎉🎉
🐵系列专栏:零基础学习C语言----- 数据结构的学习之路----C++的学习之路
🐓每日一句:如果没有特别幸运,那就请特别努力!🎉🎉🎉 ————————————————————————————

🎉文章简介

🎉本篇文章对 用C语言实现栈等相关知识 学习的相关知识进行分享!🎉💕

如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加油,一起奔跑,让我们顶峰相见!!!🎉🎉🎉
————————————————

一.栈的概念及结构

1.1栈的概念

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

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶;
出栈:栈的删除操作叫做出栈。出数据也在栈顶;

1.2栈的结构

在这里插入图片描述入数据和出数据都是从栈顶入和出;保持后进先出的原则*

1.3栈的实现

栈的实现:数组和链表都可以用来实现栈,保证先进后出原则;
数组:尾插就是进栈 尾删就是出栈(相比链表较为方便)
在这里插入图片描述我这里定义的是Top指向的是栈顶元素的下一个位置

链表:可以选择头插进栈 头删出栈
如果选择的是尾插和尾删的话,需要找尾灯操作,不方便

在这里插入图片描述

1.4栈的实现

数组实现栈(相对于链表,数组实现栈更优)

1.4.1功能函数的实现

一般的栈需要完成这几个函数

  1. 栈的初始化
  2. 栈的销毁
  3. 入栈
  4. 出栈
  5. 取栈顶元素
  6. 判断栈是否为空
void StackInit(ST* st);
void StackDestory(ST* st);void StackPush(ST* st, STDateType x);
void StackPop(ST* st);STDateType GetTop(ST* st);
bool StackEmpty(ST* st);

1.定义一个栈的结构体

这里我们实现的是动态的栈
typedef int STDateType;    //方便数据类型的替换
typedef struct Stack        
{STDateType* a;         //存储数据的数组int top;               int capacity;          //容量
}ST;

2.栈的初始化

这里top的初始化不同,top含义就不同;
1.如果top初始化给0,则每次入栈后top就会++;当入第一个数据时,top++后为1,则top含义为指向的是栈顶元素的下一个元素
2.如果top初始化为-1,则含义为指向栈顶元素
void StackInit(ST* st)
{assert(st);st->a = (STDateType* )malloc(4 * sizeof(STDateType));   if (st->a == NULL){perror("malloc fail");exit(-1);}st->top = 0;             //指向栈顶元素的下一个位置st->capacity = 4;        //初始容量给4
}   

3.入栈函数

void StackPush(ST* st, STDateType x)
{assert(st);if (st->top == st->capacity)      //扩容逻辑与顺序表一样{//扩容STDateType* tmp = (STDateType* )realloc(st->a,sizeof(STDateType) * st->capacity *2);if (tmp == NULL)     {perror("malloc fail");exit(-1);}st->a = tmp;st->capacity *= 2;     //2倍扩容}st->a[st->top] = x;      //尾插数据st->top++;
}

4.出栈函数

直接将top--;top--后虽然数据没有改变,但是在下一次入栈时会将原数据给覆盖
void StackPop(ST* st)
{assert(st);st->top--;
}

5.获取栈顶元素

STDateType GetTop(ST* st)
{assert(st);assert(st->top);            //断言return st->a[st->top - 1];    //直接返回top后一个位置的元素
}

6.判断栈是否为空

bool StackEmpty(ST* st)
{assert(st);return st->top;      //返回栈的top,如果为0则为空   非0则不为空;
}

7.栈的销毁函数

void StackDestory(ST* st)
{assert(st);free(st->a);    //释放开辟的空间st->capacity = st->top = 0;    //置空
}

1.5总代码

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int STDateType;
typedef struct Stack
{STDateType* a;int top;int capacity;
}ST;void StackInit(ST* st);
void StackDestory(ST* st);void StackPush(ST* st, STDateType x);
void StackPop(ST* st);STDateType GetTop(ST* st);
bool StackEmpty(ST* st);
#include"Stack.h"void StackInit(ST* st)
{assert(st);st->a = (STDateType* )malloc(4 * sizeof(STDateType));if (st->a == NULL){perror("malloc fail");exit(-1);}st->top = 0;st->capacity = 4;
}void StackPush(ST* st, STDateType x)
{assert(st);if (st->top == st->capacity){//扩容STDateType* tmp = (STDateType* )realloc(st->a,sizeof(STDateType) * st->capacity *2);if (tmp == NULL){perror("malloc fail");exit(-1);}st->a = tmp;st->capacity *= 2;}st->a[st->top] = x;st->top++;
}void StackPop(ST* st)
{assert(st);st->top--;
}STDateType GetTop(ST* st)
{assert(st);assert(st->top);return st->a[st->top - 1];
}bool StackEmpty(ST* st)
{assert(st);return st->top;
}void StackDestory(ST* st)
{assert(st);free(st->a);st->capacity = st->top = 0;
}

相关文章:

数据结构之栈详解(C语言手撕)

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…...

Docker学习——Dock镜像

什么是Docker镜像 Docker 镜像类似于虚拟机镜像&#xff0c;可以将它理解为一个只读的模板。 一个镜像可以包含一个基本的操作系统环境&#xff0c;里面仅安装了 Apache 应用程序&#xff08;或 用户需要的其他软件&#xff09; 可以把它称为一个 Apache 镜像。镜像是创建 Do…...

CorelDRAW Graphics Suite2024专业图形设计软件Windows/Mac最新25.0.0.230版

CorelDRAW Graphics Suite 2024是一款专业的图形设计软件&#xff0c;它集成了CorelDRAW Standard 2024和其他高级图形处理工具&#xff0c;为用户提供了全面的图形设计和编辑解决方案。 该软件拥有强大的矢量编辑功能&#xff0c;用户可以轻松创建和编辑矢量图形&#xff0c;…...

el-form表单中,对非表单内字段增加校验的方法

1、问题说明&#xff1a; 在开发表单的时候&#xff0c;可能会遇到el-form-item中绑定的值不在表单绑定的数据对象中。 此时用prop绑定该字段名是无效的&#xff0c;需要单独对这个字段进行校验。 在el-form-item中有一个属性 error 。用于表单域验证错误信息&#xff0c;设…...

【VTKExamples::Points】第四期 ExtractEnclosedPoints

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ExtractEnclosedPoints,并解析接口vtkExtractEnclosedPoints,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我…...

bug--xxoobject has no attribute xxx

Python 创建类的实例后却不能调用写的方法&#xff0c;检查了半天原来是缩进的问题&#xff0c;def函数不应该和class并列 只能说这个英文空格太小了&#xff0c;看不出来。。。。...

7 BUILD.gn文件怎么写,Gn + Ninja编译一个Hello world程序的例子Demo

BUILD.gn文件怎么写&#xff0c;Gn Ninja编译一个Hello world程序的例子Demo 作者将狼才鲸创建日期2024-03-11 Ninja安装流程见&#xff1a;一个能直接运行的Ninja例子&#xff0c;build.ninja文件怎么写&#xff1f;Gn安装流程见&#xff1a;Ubuntu18.04下安装Gn软件 这是一…...

北京市行政村边界shp数据/北京市乡镇边界/北京市土地利用分类数据

北京是一座有着三千多年历史的古都&#xff0c;在不同的朝代有着不同的称谓&#xff0c;大致算起来有二十多个别称。北京地势西北高、东南低。西部、北部和东北部三面环山&#xff0c;东南部是一片缓缓向渤海倾斜的平原。境内流经的主要河流有&#xff1a;永定河、潮白河、北运…...

力扣--动态规划/深度优先算法/回溯算法93.复原IP地址

这题主要用了动态规划和回溯算法。 动态规划数组初始化&#xff08;DP数组&#xff09;: 首先&#xff0c;创建一个二维数组dp&#xff0c;用于记录字符串中哪些部分是合法的IP地址。对字符串进行遍历&#xff0c;同时考虑每个可能的IP地址部分&#xff08;每部分由1到3个字符组…...

第一次Python小练习题目

1.打印某学校的校训&#xff0c;具体内容如下所示&#xff1a; ****************************** 勤奋 严谨 求实 创新 ****************************** 注意: 第一行和最后一行各有 30 个*号。 答案&#xff1a; school_strs "勤奋 严谨 求实 创新&q…...

[BUG] docker运行Java程序时配置代理-Dhttp.proxyHost后启动报错

[BUG] docker运行Java程序时配置代理-Dhttp.proxyHost后启动报错 bug现象描述 版本&#xff1a;2.0.4&#xff08;客户端和服务端都是&#xff09; 环境&#xff1a;私有云环境&#xff0c;只有少量跳板机器可以访问公网&#xff0c;其他机器均通过配置代理方式访问公网 bug现…...

Python网站的搭建和html基础

1.Python网站代码及讲解 一般我们搭建小型的网站就用flask库就行了。 &#xff08;1&#xff09;安装flask库 安装完python后&#xff0c;按住windows徽标键和r,弹出“运行”&#xff0c;在里面输入cmd。 回车打开&#xff0c;输入“pip install flask”。 &#xff08;2&am…...

SpringCloud(21)之SpringCloud Alibaba Nacos实战应用

一、Nacos安装 1.1 Nacos概述 Nacos是Alibaba微服务生态组件中的重要组件之一&#xff0c;主要用它实现应用的动态服务发现、配置管理、 服务管理。Nacos discovery alibaba/spring-cloud-alibaba Wiki GitHub Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简…...

Python 基础语法:基本数据类型(元组)

1 元组&#xff08;Tuples&#xff09;概述 1.1 元组的定义与特点 元组&#xff08;Tuples&#xff09;是Python中的一个内置数据类型&#xff0c;用于存储一系列有序的元素。元组中的元素可以是任何类型&#xff0c;包括数字、字符串、列表等&#xff0c;且元素之间用逗号…...

vuepress-theme-vdoing博客搭建教程

搭建流程 前言 这是笔者搭建个人博客所经历的流程&#xff0c;特附上笔记 笔者个人博客地址&#xff1a;沉梦听雨的编程指南 一、主题介绍 本博客使用的主题为&#xff1a;vuepress-theme-vdoing&#xff0c;相关介绍和使用方法可以参考该主题的官方文档 官方文档快速上手…...

ICC2:create terminal参考脚本

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 set list "" set i 0 ; set length xx set width xx foreach port $list { if {$i &#xff1d;&#xff1d; 0} { set startx 0 set starty 0 } else { set sta…...

并行计算CUDA DEMO

//并行计算CUDA DEMO #include "cuda_runtime.h" #include "device_launch_parameters.h" #include <stdio.h> cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size); __global__ void addKernel(int *c, const int …...

【linux线程(一)】什么是线程?怎样操作线程?

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux线程 1. 前言2. 什么是线…...

python-0002-linux安装pycharm

下载软件包 下载地址&#xff1a;https://download.csdn.net/download/qq_41833259/88944791 安装 # 解压 tar -zxvf 你的软件包 # 进入软件解压后的路径&#xff0c;如解压到了/home/soft/pycharm cd /home/soft/pycharm cd bin # 执行启动命令 sh pycharm.sh # 等待软件启…...

扭蛋机小程序,扭蛋与互联网结合下的商机

扭蛋机作为一种娱乐消费模式&#xff0c;受众群体不再局限于儿童&#xff0c;也吸引了众多的年轻消费者。扭蛋机具有较大的随机性&#xff0c;玩具商品随机掉落&#xff0c;在购买前消费者完全不知道扭蛋中的商品是什么&#xff0c;这种未知性带来的惊喜感是吸引众多消费者的主…...

ACAN2517 Arduino CAN驱动库:经典CAN 2.0B工业通信实战指南

1. 项目概述 ACAN2517 是一款专为 Microchip MCP2517FD、MCP2518FD 和 MCP251863 系列 CAN 控制器设计的 Arduino 兼容驱动库&#xff0c;工作于经典 CAN 2.0B 协议模式。该库并非面向 CAN FD&#xff08;Flexible Data-Rate&#xff09;高速扩展协议&#xff0c;而是聚焦于工业…...

Spring IOC 源码学习 事务相关的 BeanDefinition 解析过程 (XML)比

从0构建WAV文件&#xff1a;读懂计算机文件的本质 虽然接触计算机有一段时间了&#xff0c;但是我的视野一直局限于一个较小的范围之内&#xff0c;往往只能看到于算法竞赛相关的内容&#xff0c;计算机各种文件在我看来十分复杂&#xff0c;认为构建他们并能达到目的是一件困难…...

体系结构论文(九十八):NPUEval: Optimizing NPU Kernels with LLMs and Open Source Compilers

NPUEval: Optimizing NPU Kernels with LLMs and Open Source Compilers 【AMD 2025报告】一、这篇文章在做什么这篇文章讨论的不是一般的软件代码生成&#xff0c;而是一个更窄、也更难的问题&#xff1a;大语言模型能不能为 NPU 写出“既能跑、又真正高效”的 kernel 代码&am…...

Maomi.In | .NET 全能多语言解决方案鞍

AI Agent 时代的沙箱需求 从 Copilot 到 Agent&#xff1a;执行能力的质变 在生成式 AI 的早期阶段&#xff0c;应用主要以“Copilot”形式存在&#xff0c;AI 仅作为辅助生成建议。然而&#xff0c;随着 AutoGPT、BabyAGI 以及 OpenAI Code Interpreter&#xff08;现为 Advan…...

移动系统设计重构指南:基于mobile-system-design框架的7步重构策略 [特殊字符]

移动系统设计重构指南&#xff1a;基于mobile-system-design框架的7步重构策略 &#x1f680; 【免费下载链接】mobile-system-design A simple framework for mobile system design interviews 项目地址: https://gitcode.com/gh_mirrors/mo/mobile-system-design 在移…...

进程与线程的核心区别:一篇看懂,告别混淆

在编程学习中&#xff0c;尤其是接触 C 多线程、操作系统相关知识时&#xff0c;进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是两个绕不开的概念。很多新手会把二者混为一谈&#xff0c;甚至像之前我被问到的那样&#xff0c;疑惑“进程是不是线…...

Meta携全新模型Muse Spark重返AI竞争赛道

Meta超级智能实验室正式发布旗下首款模型&#xff0c;这也是自马克扎克伯格斥巨资对公司AI体系进行全面改革以来的重要里程碑。该模型名为Muse Spark&#xff0c;目前已接入美国市场的Meta AI应用程序及Meta AI官网。据官方公告&#xff0c;未来数周内&#xff0c;Muse Spark还…...

深入解析SFP、QSFP等光电模块:从基础到高速应用的全面指南

1. 光电模块入门&#xff1a;从铜缆到光纤的革命 记得我第一次接触网络设备时&#xff0c;看到机房里密密麻麻的线缆和闪烁的指示灯完全摸不着头脑。直到老师傅指着那些小巧的模块说&#xff1a;"这些就是网络流量的高速公路收费站"&#xff0c;我才恍然大悟。SFP、…...

Honey Select 2 HF Patch整合方案:插件优化工具使用指南

Honey Select 2 HF Patch整合方案&#xff1a;插件优化工具使用指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch Honey Select 2 HF Patch是一款专为《Honey…...

Zotero文献去重终极指南:如何快速清理重复条目提升研究效率

Zotero文献去重终极指南&#xff1a;如何快速清理重复条目提升研究效率 【免费下载链接】ZoteroDuplicatesMerger A zotero plugin to automatically merge duplicate items 项目地址: https://gitcode.com/gh_mirrors/zo/ZoteroDuplicatesMerger 你是否曾经在Zotero文献…...