数据结构:栈(含源码)
目录
一、栈的概念和结构
二、栈的实现
2.1 头文件
2.2 各个功能的实现
初始化栈
入栈
出栈
获取栈顶元素和栈中有效个数
判断栈是否为空
栈的销毁
2.3 测试
完整源码
一、栈的概念和结构
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的数据元素遵守后进先出的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈,出数据也在栈顶。
后进先出示意图
后进先出步骤分解
二、栈的实现
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些,因为数组在尾上插入数据的代价比较小。
2.1 头文件
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top; // 栈顶int capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps);
// 入栈
void StackPush(Stack* ps, STDataType data);
// 出栈
void StackPop(Stack* ps);
// 获取栈顶元素
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(Stack* ps);
// 销毁栈
void StackDestroy(Stack* ps);
我们在创建栈时,一般是创建支持动态增长的栈,定长的静态栈不实用。这里的top就相当于是存储栈顶元素,capacity在入栈时为是否要增容提供判断条件。
2.2 各个功能的实现
初始化栈
void StackInit(Stack* ps)
{ps->a = NULL;ps->top = ps->capacity = 0;
}
数组置空,栈顶数字和容量归0。
入栈
void StackPush(Stack* ps, STDataType data)
{if (ps->top == ps->capacity){int newcapacity =ps->capacity== 0 ? 4 : ps->capacity*2;STDataType* tem = (STDataType*)realloc(ps->a, newcapacity*sizeof(STDataType));if (tem == NULL){perror("realloc fail");return;}ps->capacity = newcapacity;ps->a = tem;}ps->a[ps->top++] = data;
}
先判断容量是否有足够的空间让数据入栈,在第一次入栈是先给定4个空间,后面每次不够时就将空间数乘以2, 还有一个判断是否开辟成功(这个可以不写,一般都会开辟成功)。
出栈
void StackPop(Stack* ps)
{assert(ps);ps->top--;
}
出栈非常的简单,只要将top数减少一个就行了,相当于是下一次入栈是直接把这个数据修改掉,就算没修改,打印时也不影响。
获取栈顶元素和栈中有效个数
STDataType StackTop(Stack* ps)
{assert(ps);assert(ps->top > 0);return ps->a[ps->top-1];
}
int StackSize(Stack* ps)
{assert(ps);return ps->top;
}
两个都是比较简单的代码,只要用top就可以知道栈顶元素和栈中的元素个数。
判断栈是否为空
bool StackEmpty(Stack* ps)
{assert(ps);return ps->top == 0;
}
栈中个数为0那么就是空栈,也是直接用到了top,。
栈的销毁
void StackDestroy(Stack* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}
和初始化类似,数组置空,top和capacity归0。
2.3 测试
写完代码后还是需要测试的
int main()
{Stack s;StackInit(&s);StackPush(&s, 1);StackPush(&s, 2);StackPush(&s, 3);StackPush(&s, 4);StackPush(&s, 5);while (!StackEmpty(&s)){printf("%d\n", StackTop(&s));StackPop(&s);}StackDestroy(&s);
}
我这里就是先入栈五个元素,然后在一个循环中打印,每打印一个就将栈顶元素出栈,直到栈变为空栈结束打印。
完整源码
zhan.h
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top; int capacity;
}Stack;void StackInit(Stack* ps);void StackPush(Stack* ps, STDataType data);void StackPop(Stack* ps);STDataType StackTop(Stack* ps);int StackSize(Stack* ps);bool StackEmpty(Stack* ps);void StackDestroy(Stack* ps);
zhan.c
#include"zhan.h"
void StackInit(Stack* ps)
{ps->a = NULL;ps->top = ps->capacity = 0;
}
void StackPush(Stack* ps, STDataType data)
{if (ps->top == ps->capacity){int newcapacity =ps->capacity== 0 ? 4 : ps->capacity*2;STDataType* tem = (STDataType*)realloc(ps->a, newcapacity*sizeof(STDataType));if (tem == NULL){perror("realloc fail");return;}ps->capacity = newcapacity;ps->a = tem;}ps->a[ps->top++] = data;
}
void StackPop(Stack* ps)
{assert(ps);ps->top--;
}
STDataType StackTop(Stack* ps)
{assert(ps);assert(ps->top > 0);return ps->a[ps->top-1];
}
int StackSize(Stack* ps)
{assert(ps);return ps->top;
}
bool StackEmpty(Stack* ps)
{assert(ps);return ps->top == 0;
}
void StackDestroy(Stack* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}
最好是要自己写一遍,这样才能加深印象,也更能理解栈相关的知识。
本篇关于栈的内容就到这里了,希望对各位有帮助,如果有错误欢迎指出,感谢支持。

相关文章:
数据结构:栈(含源码)
目录 一、栈的概念和结构 二、栈的实现 2.1 头文件 2.2 各个功能的实现 初始化栈 入栈 出栈 获取栈顶元素和栈中有效个数 判断栈是否为空 栈的销毁 2.3 测试 完整源码 一、栈的概念和结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和…...
如何使用Markdown编辑器
欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…...
当代最火的哲学家颜廷利:全球公认十个最厉害的思想家之一
颜廷利书法特点和艺术成就:全球公认十个最厉害的思想家之一,颜廷利教授是一位杰出的书法家,他的书法作品不仅体现了中国传统文化,而且在国内外享有高度评价,对当代书法艺术产生了深远的影响。在中国十大顶级哲学家排行榜上,当今世界最重要的思想家颜廷利教授的书…...
android13内核增加调试接口给上层使用
总纲 android13 rom 开发总纲说明 目录 1.前言 2.处理方法分析 3.代码参考 3.1方法1 3.2方法2 3.3方法3 3.4方法4 4.彩蛋 1.前言 有时候,我们在开机的过程中,adb服务还没有起来,系统奔溃了,不能正常开机,我们没法看到相关的logcat信息,导致我们不能很快的定…...
linux:phpstudy安装及日常命令使用[表格]
官网安装:小皮面板下载安装,一键管理服务器-小皮面板 (xp.cn) centos安装: yum install -y wget && sudo wget -O install.sh https://dl.xp.cn/dl/xp/install.sh && sudo bash install.sh 快速使用 [rootlocalhost ~]# …...
【python】Linux升级版本
目的 迁移项目包路径到服务器上 查看服务器包是否和本地已有项目python版本相同然后发现~嗯不一样 项目上包时用的3.8~ 服务器用的2.7 查看方法: python -version解决方案 一:项目所有包重新下载 二:升级服务器python版本 第二种步骤&…...
鸿蒙开发if判断有点坑
它的判断和Android的有点不同,归结到底不是同一种语言,数据类型不一样 if (0) {logContent("aa","0") } else {logContent("aa","00")...
IT课程学习搭子
各种IT课程齐全可学,价格你绝对想不到,相比于培训班有以下优势: 1、避免被割韭菜,避免踩坑,避免交智商税,最低的成本学最有价值的课,同时又能达到比培训班更好的效果 2、收徒,带你学…...
hive拼接字符串concat函数的用法
在 Hive 中,字符串拼接是一种常见的操作,用于将多个字符串连接在一起形成一个新的字符串。这在数据处理和分析过程中经常会用到,比如将不同列的值拼接成一个完整的信息、拼接成文件路径等等。 字符串拼接函数 在 Hive 中,我们可…...
Linux-理解shell
文章目录 5. 理解shell5.1 shell的类型5.2 交互shell和系统默认shell5.3 安装zsh shell程序5.4 shell的父子关系5.5 命令列表5.6 命令分组5.7 使用命令分组创建子shell5.8 子shell用法5.9 shell的非内建命令和内建命令5.9.1 非内建命令5.9.2 内建命令5.9.3 history和alias命令介…...
FutureTask详解
目录 FutureTask详解1、FutureTask简介2、FutureTask内部结构继承结构类属性构造方法内部类WaitNode 3、Runnable、Callable、Future、RunnableFuture接口①、Runnable接口②、Callable接口③、Future接口④、RunnableFuture接口总结对比 4、FutureTask的使用示例普通Thread使用…...
javase综合案例4 -- 考试系统
文章目录 一,项目要求二,创建实体类ExamItem三,创建考试服务类ExamService3.1 全局变量 考题列表itemList(List< ExamItem >类型),答案数组answerArr (String[]类型),得分score3.2 初始化方法init()3.3 打印菜单…...
Logistic回归
Logistic回归模型: 适用于二分类或多分类问题,样本特征是数值型(否则需要转换为数值型) 策略:极大似然估计 算法:随机梯度 或 BFGS算法(改进的拟牛顿法) 线性回归表达式…...
Langchain-Chatchat+Xinference集成部署
Langchain-ChatchatXinference集成部署 安装环境: 系统:Anolis OS 8.9 python版本:Python 3.9.19 Langchain-Chatchat版本:0.3.1.3 Xinference版本:v0.13.3 模型选择(下载时需要科学上网)&#…...
江协科技51单片机学习- p33 PWM呼吸灯和直流驱动电机调速
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...
使用Jetbrains.Rider反编译Unity的DLL文件看源码
直接将dll文件的打开方式用Rider打开即可,打开BattleSeqGenertor.dll文件的效果如下:...
【学习笔记】决策单调性优化DP
背景 GDCPC还在发力,清华出题组出的牛客还是 4 题。 这次没有min25筛,不然我能5题(bushi 除了一道用 prufer 序列的恶心 DP 外,还有一道DP题是一个状态难想,并且还需要决策单调性优化的DP,被认为是偏简单…...
【每日一题】【二分图最大匹配】【经典板子题】有大家喜欢的零食吗 河南萌新联赛2024第(一)场:河南农业大学 C题 C++
河南萌新联赛2024第(一)场:河南农业大学 C题 有大家喜欢的零食吗 题目描述 在某幼儿园中共有 n n n个小朋友,该幼儿园的老师为这 n n n 个小朋友准备了 n n n 份不一样的零食大礼包。每个小朋友只能选择一个,但老…...
【python】OpenCV—Image Colorization
文章目录 1、CIELAB 色彩空间2、作色问题定义3、Caffe 模型4、代码实现——Image5、代码实现——Video6、参考 1、CIELAB 色彩空间 Lab颜色空间,也称为Lab色彩空间或CIELAB色彩空间,是一种基于人类视觉感知特性的颜色模型。它是在1931年国际照明委员会&…...
vue 学习笔记
模板语法 1. 插值语法 用于解析标签体内容 { { 表达式 } } ,可以直接读取到 data 中的所有属性 2. 指令语法 解析标签(标签属性, 标签内容, 绑定事件) v-bind : href " url " 或 : href &…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...
RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...
