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


🎉个人名片:
🐼作者简介:一名乐于分享在学习道路上收获的大二在校生
🙈个人主页🎉:GOTXX
🐼个人WeChat:ILXOXVJE
🐼本文由GOTXX原创,首发CSDN🎉🎉🎉
🐵系列专栏:零基础学习C语言----- 数据结构的学习之路----C++的学习之路
🐓每日一句:如果没有特别幸运,那就请特别努力!🎉🎉🎉 ————————————————————————————
🎉文章简介:
🎉本篇文章对 用C语言实现栈等相关知识 学习的相关知识进行分享!🎉💕
如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加油,一起奔跑,让我们顶峰相见!!!🎉🎉🎉
————————————————
一.栈的概念及结构
1.1栈的概念
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作;进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守 后进先出 的原则;
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶;
出栈:栈的删除操作叫做出栈。出数据也在栈顶;
1.2栈的结构
入数据和出数据都是从栈顶入和出;保持后进先出的原则*
1.3栈的实现
栈的实现:数组和链表都可以用来实现栈,保证先进后出原则;
数组:尾插就是进栈 尾删就是出栈(相比链表较为方便)
我这里定义的是Top指向的是栈顶元素的下一个位置
链表:可以选择头插进栈 头删出栈
如果选择的是尾插和尾删的话,需要找尾灯操作,不方便

1.4栈的实现
数组实现栈(相对于链表,数组实现栈更优)
1.4.1功能函数的实现
一般的栈需要完成这几个函数
- 栈的初始化
- 栈的销毁
- 入栈
- 出栈
- 取栈顶元素
- 判断栈是否为空
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语言手撕)
🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…...
Docker学习——Dock镜像
什么是Docker镜像 Docker 镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。 一个镜像可以包含一个基本的操作系统环境,里面仅安装了 Apache 应用程序(或 用户需要的其他软件) 可以把它称为一个 Apache 镜像。镜像是创建 Do…...
CorelDRAW Graphics Suite2024专业图形设计软件Windows/Mac最新25.0.0.230版
CorelDRAW Graphics Suite 2024是一款专业的图形设计软件,它集成了CorelDRAW Standard 2024和其他高级图形处理工具,为用户提供了全面的图形设计和编辑解决方案。 该软件拥有强大的矢量编辑功能,用户可以轻松创建和编辑矢量图形,…...
el-form表单中,对非表单内字段增加校验的方法
1、问题说明: 在开发表单的时候,可能会遇到el-form-item中绑定的值不在表单绑定的数据对象中。 此时用prop绑定该字段名是无效的,需要单独对这个字段进行校验。 在el-form-item中有一个属性 error 。用于表单域验证错误信息,设…...
【VTKExamples::Points】第四期 ExtractEnclosedPoints
很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ExtractEnclosedPoints,并解析接口vtkExtractEnclosedPoints,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我…...
bug--xxoobject has no attribute xxx
Python 创建类的实例后却不能调用写的方法,检查了半天原来是缩进的问题,def函数不应该和class并列 只能说这个英文空格太小了,看不出来。。。。...
7 BUILD.gn文件怎么写,Gn + Ninja编译一个Hello world程序的例子Demo
BUILD.gn文件怎么写,Gn Ninja编译一个Hello world程序的例子Demo 作者将狼才鲸创建日期2024-03-11 Ninja安装流程见:一个能直接运行的Ninja例子,build.ninja文件怎么写?Gn安装流程见:Ubuntu18.04下安装Gn软件 这是一…...
北京市行政村边界shp数据/北京市乡镇边界/北京市土地利用分类数据
北京是一座有着三千多年历史的古都,在不同的朝代有着不同的称谓,大致算起来有二十多个别称。北京地势西北高、东南低。西部、北部和东北部三面环山,东南部是一片缓缓向渤海倾斜的平原。境内流经的主要河流有:永定河、潮白河、北运…...
力扣--动态规划/深度优先算法/回溯算法93.复原IP地址
这题主要用了动态规划和回溯算法。 动态规划数组初始化(DP数组): 首先,创建一个二维数组dp,用于记录字符串中哪些部分是合法的IP地址。对字符串进行遍历,同时考虑每个可能的IP地址部分(每部分由1到3个字符组…...
第一次Python小练习题目
1.打印某学校的校训,具体内容如下所示: ****************************** 勤奋 严谨 求实 创新 ****************************** 注意: 第一行和最后一行各有 30 个*号。 答案: school_strs "勤奋 严谨 求实 创新&q…...
[BUG] docker运行Java程序时配置代理-Dhttp.proxyHost后启动报错
[BUG] docker运行Java程序时配置代理-Dhttp.proxyHost后启动报错 bug现象描述 版本:2.0.4(客户端和服务端都是) 环境:私有云环境,只有少量跳板机器可以访问公网,其他机器均通过配置代理方式访问公网 bug现…...
Python网站的搭建和html基础
1.Python网站代码及讲解 一般我们搭建小型的网站就用flask库就行了。 (1)安装flask库 安装完python后,按住windows徽标键和r,弹出“运行”,在里面输入cmd。 回车打开,输入“pip install flask”。 (2&am…...
SpringCloud(21)之SpringCloud Alibaba Nacos实战应用
一、Nacos安装 1.1 Nacos概述 Nacos是Alibaba微服务生态组件中的重要组件之一,主要用它实现应用的动态服务发现、配置管理、 服务管理。Nacos discovery alibaba/spring-cloud-alibaba Wiki GitHub Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简…...
Python 基础语法:基本数据类型(元组)
1 元组(Tuples)概述 1.1 元组的定义与特点 元组(Tuples)是Python中的一个内置数据类型,用于存储一系列有序的元素。元组中的元素可以是任何类型,包括数字、字符串、列表等,且元素之间用逗号…...
vuepress-theme-vdoing博客搭建教程
搭建流程 前言 这是笔者搭建个人博客所经历的流程,特附上笔记 笔者个人博客地址:沉梦听雨的编程指南 一、主题介绍 本博客使用的主题为:vuepress-theme-vdoing,相关介绍和使用方法可以参考该主题的官方文档 官方文档快速上手…...
ICC2:create terminal参考脚本
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 set list "" set i 0 ; set length xx set width xx foreach port $list { if {$i == 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线程(一)】什么是线程?怎样操作线程?
💓博主CSDN主页:杭电码农-NEO💓 ⏩专栏分类:Linux从入门到精通⏪ 🚚代码仓库:NEO的学习日记🚚 🌹关注我🫵带你学更多操作系统知识 🔝🔝 Linux线程 1. 前言2. 什么是线…...
python-0002-linux安装pycharm
下载软件包 下载地址:https://download.csdn.net/download/qq_41833259/88944791 安装 # 解压 tar -zxvf 你的软件包 # 进入软件解压后的路径,如解压到了/home/soft/pycharm cd /home/soft/pycharm cd bin # 执行启动命令 sh pycharm.sh # 等待软件启…...
扭蛋机小程序,扭蛋与互联网结合下的商机
扭蛋机作为一种娱乐消费模式,受众群体不再局限于儿童,也吸引了众多的年轻消费者。扭蛋机具有较大的随机性,玩具商品随机掉落,在购买前消费者完全不知道扭蛋中的商品是什么,这种未知性带来的惊喜感是吸引众多消费者的主…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
