数据结构----链式栈
目录
前言
链式栈
操作方式
1.存储结构
2.初始化
3.创建节点
4.判断是否满栈
5.判断是否空栈
6.入栈
7.出栈
8.获取栈顶元素
9.遍历栈
10.清空栈
完整代码
前言
前面我们学习过了数组栈的相关方法,(链接:线性表-----栈(栈的初始化、建立、入栈、出栈、遍历、清空等操作)_灰勒塔德的博客-CSDN博客)那么今天我们就开始学习新的结构栈---链式栈,顾名思义就是通过链表的结构来实现栈的相关方法操作,包括创建、判断空满、出栈、入栈、遍历和清空等操作,下面就一起来看看吧!

链式栈
图示如下:

操作方式
#include<stdio.h>
#include<stdlib.h>
#define Maxsize 20 //设置最大节点数量create_node(ElemType data);//创建节点stack_init(Stack* top);//初始化isFull(Stack* top);//判断是否满栈isEmpty(Stack* top);//判断是否空栈push(Stack* top, ElemType data);//入栈pop(Stack* top);//入栈get_stacktop(Stack* top);//获取栈顶元素show_stack(Stack* top);//遍历栈clear_stack(Stack* top);//清空栈
1.存储结构
今天实现的是栈的链式储存,也就是俗称“链栈”。由于之前实现过单链表,对于栈的链式存储,二者原理是一样的,只不过在操作上链栈是受限的——仅能在栈顶进行插入和删除!话不多说,先看链栈的存储结构
//数据类型
typedef struct datatype {int age;char name[10];int num;
}ElemType;
//节点
typedef struct node {ElemType data;struct node* next;
}Node;
//栈顶指示
typedef struct stack {int count; //计数Node* point;
}Stack;
2.初始化
初始化就让头指针指向的位置为NULL,节点计数为0
//初始化
void stack_init(Stack* top) {top->count = 0;top->point = NULL;
}
3.创建节点
创建节点就通过链表的方式去创建节点,然后把数据值赋予给这个节点
//创建节点
Node* create_node(ElemType data) {Node* new_node = (Node*)malloc(sizeof(Node));if (new_node) {new_node->data = data;new_node->next = NULL;return new_node;}else{printf("ERROR\n");}
}
4.判断是否满栈
判断是否满栈只需要看此时计数是否达到最大容量节点数量即可
//判断是否满
int isFull(Stack* top) {if (top->count > Maxsize) {printf("The stack is full\n");return 1;}return 0;
}
5.判断是否空栈
这时候只需要看计数是否为0就行了
//判断是否为空
int isEmpty(Stack* top) {if (top->count == 0) {printf("The stack is empty\n");return 1;}return 0;
}
6.入栈
进行入栈的操作类似于链表的成链操作,也就是说把创建好的节点连起来即可,不同的是此时每放入一个节点的时候,栈顶指针top要往栈顶依次往上移动,计数也要+1,代码如下所示:
//入栈
void push(Stack* top, ElemType data) {Node* new_node = create_node(data);if (new_node&&!isFull(top)) {top->count++;if (top->count == 1) {//如果入栈是第一个节点的话top->point = new_node;}else{//以下两个步骤不能调过来!new_node->next = top->point;top->point = new_node;}}elsereturn;
}
7.出栈
出栈时,先获取到此时栈顶指针指向的位置pop_node,再把栈顶指针向下移动一位,计数减一,然后返回这个元素pop_node即可:
//出栈
Node* pop(Stack* top) {Node* pop_node=NULL;if (!isEmpty(top)) {pop_node = top->point;top->point = pop_node->next;pop_node->next = NULL;top->count--;}return pop_node;
}
8.获取栈顶元素
获取栈顶元素不需要出栈,只需要返回栈顶元素即可:
//获取栈顶元素
Node* get_stacktop(Stack* top) {return top->point;
}
9.遍历栈
遍历栈,从栈顶开始,依次往下遍历输出数据即可:
//遍历栈
void show_stack(Stack* top) {Node* cur = top->point;while (cur) {printf("%d %s %d\n", cur->data.age, cur->data.name, cur->data.num);cur = cur->next;}printf("Print over!\n");
}
10.清空栈
清空栈,就要去依次把每一个节点的空间给释放掉,然后栈顶往下移动,直到移动到最初始的位置。
//清空栈
void clear_stack(Stack* top) {Node* cur;while (top->point) {cur = top->point;top->point = cur->next;free(cur);}printf("Clear successfully!\n");
}
完整代码
#include<stdio.h>
#include<stdlib.h>
#define Maxsize 20 //设置最大节点数量//链表栈//数据类型
typedef struct datatype {int age;char name[10];int num;
}ElemType;
//节点
typedef struct node {ElemType data;struct node* next;
}Node;
//栈顶指示
typedef struct stack {int count; //计数Node* point;
}Stack;//创建节点
Node* create_node(ElemType data) {Node* new_node = (Node*)malloc(sizeof(Node));if (new_node) {new_node->data = data;new_node->next = NULL;return new_node;}else{printf("ERROR\n");}
}//初始化
void stack_init(Stack* top) {top->count = 0;top->point = NULL;
}//判断是否满
int isFull(Stack* top) {if (top->count > Maxsize) {printf("The stack is full\n");return 1;}return 0;
}
//判断是否为空
int isEmpty(Stack* top) {if (top->count == 0) {printf("The stack is empty\n");return 1;}return 0;
}//入栈
void push(Stack* top, ElemType data) {Node* new_node = create_node(data);if (new_node&&!isFull(top)) {top->count++;if (top->count == 1) {//如果入栈是第一个节点的话top->point = new_node;}else{new_node->next = top->point;top->point = new_node;}}elsereturn;
}//出栈
Node* pop(Stack* top) {Node* pop_node=NULL;if (!isEmpty(top)) {pop_node = top->point;top->point = pop_node->next;pop_node->next = NULL;top->count--;}return pop_node;
}//获取栈顶元素
Node* get_stacktop(Stack* top) {return top->point;
}//遍历栈
void show_stack(Stack* top) {Node* cur = top->point;while (cur) {printf("%d %s %d\n", cur->data.age, cur->data.name, cur->data.num);cur = cur->next;}printf("Print over!\n");
}//清空栈
void clear_stack(Stack* top) {Node* cur;while (top->point) {cur = top->point;top->point = cur->next;free(cur);}printf("Clear successfully!\n");
}int main() {Stack top;stack_init(&top);//初始化ElemType data[4] = { {15,"Jack",01},{16,"Leimu",02},{17,"Lamu",03},{18,"Ajx",04} };for (int i = 0; i < 4; i++) {push(&top, data[i]);//入栈操作}show_stack(&top);//遍历栈Node* out_data=pop(&top);//出栈操作printf("%d %s %d\n", out_data->data.age, out_data->data.name, out_data->data.num);clear_stack(&top);//清空栈
}

以上就是本期的内容,喜欢的给个关注吧!我们下一次再见!
相关文章:
数据结构----链式栈
目录 前言 链式栈 操作方式 1.存储结构 2.初始化 3.创建节点 4.判断是否满栈 5.判断是否空栈 6.入栈 7.出栈 8.获取栈顶元素 9.遍历栈 10.清空栈 完整代码 前言 前面我们学习过了数组栈的相关方法,(链接:线性表-----栈(栈…...
实在智能携手40+央企,探索财务大模型及数智化实践与应用
“这次培训给我一个最大的感触就是,过去以为AI智能化、大模型技术是很高深的事情。但现在,我们通过RPA等数字化工具,自主根据自己的工作岗位,完成业务自动化流程的开发和设计。AI技术没有想象中的那么难入门。” 这是一位参加了“…...
upload-labs文件上传1-5关
第一关 编写一句话木马1.php,编写完成后将后缀名修改为png 将1.png上传,上传时使用bp抓包 抓包后将后缀名修改为png 连接蚁剑 第二关 上传1.php,显示文件类型不正确 使用bp抓包发送重发器,修改文件后缀名后点击发送,…...
git的基本使用
查看当前分支 git branch //查看本地分支 git branch -a // 查看本地和远程的分支切分支 git checkout -b 分支的名字从当前分支切换到其他分支 拉取远程分支到本地 拉取远程develop分支代码到本地develop分支 git checkout -b develop origin/developgit merge B分支合并…...
Mac台式电脑内存清理方法教程
对于一些小白用户,如果觉得以上的清理方法比较复杂却又想要更好的优化Mac电脑内存,专业的系统清理软件是一个不错的选择。比起花几个小时时间浏览文件夹、删除临时文件、缓存和卸载残留。Cleanmymac X,只需单击几下即可完成所有内存清理工作&…...
FL Studio怎么破解?2023年最新FL Studio 21图文安装激活教程?FL 21中文版下载 v21.1.1.3750 汉化 版
fl studio21中文解锁特别破解版是一款功能强大的编曲软件,也就是众所熟知的水果软件。它可以编曲、剪辑、录音、混音,让您的计算机成为全功能录音室。除此之外,这款软件功能非常强大,为用户提供了许多音频处理工具,包含…...
Zookeeper高级_四字命令
之前使用stat命令来验证ZooKeeper服务器是否启动成功,这里的stat命令就是ZooKeeper 中最为典型的命令之一。ZooKeeper中有很多类似的命令,它们的长度通常都是4个英文字母,因此我们称之为“四字命令”。 添加配置 vim zoo.cfg 4lw.commands…...
/usr/bin/ld: cannot find -lmysqlcllient
文章目录 1. question: /usr/bin/ld: cannot find -lmysqlcllient2. solution 1. question: /usr/bin/ld: cannot find -lmysqlcllient 2. solution 在 使用编译命令 -lmysqlclient时,如果提示这个信息。 先确认一下 有没有安装mysql-devel 执行如下命令 yum inst…...
折线图geom_line()参数选项
往期折线图教程 图形复现| 使用R语言绘制折线图折线图指定位置标记折线图形状更改 | 绘制动态折线图跟着NC学作图 | 使用python绘制折线图 前言 我们折线的专栏推出一段时间,但是由于个人的原因,一直未进行更新。那么今天,我们也参考《R语…...
百度SEO优化基本原理(掌握SEO基础,提高网站排名)
随着互联网的迅速发展,越来越多的企业开始意识到网站优化的重要性,其中百度SEO优化是企业不可忽视的一项工作。本文将介绍百度SEO优化的基本概念、步骤、原理、解决方法和提升网站标题优化的方法。蘑菇号-www.mooogu.cn 百度SEO优化是指针对百度搜索引擎…...
2023 ICPC 网络赛 第一场 部分题解 (待完善)
D Transitivity 题解: 根据题意可以推出结论: 如果存在连通块,那么这个连通块要满足条件,必然是满连通块. 一共有两种情况 1. 存在一个连通块不是满连通块 设cnt表示连通块的节点个数, num表示连通块边的个数 一个连通块的贡献 cnt*(cnt-1)/2 - num; 那么最终答案 连…...
Hadoop的HDFS高可用方案
一、Hadoop高可用简介 Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFSNameNode 对数据存储及其一致性的要求比 YARN ResourceManger 高得多,所以它的实现也更加复杂 1、HDFS系统高可用简介…...
【计算机基础】让我们重新认识一下Visual Stduio及其操作,知识点汇总!!
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
使用Node构建私人代理池
在进行大规模数据采集时,经常会遇到网站反爬虫机制导致爬虫被封的问题。为了解决这个困扰,本文将向大家介绍如何利用Node.js构建私人代理池,提供稳定的代理,实现高效、可靠的爬虫操作。跟随本文一起学习,拥有解封爬虫的…...
2023年“羊城杯”网络安全大赛 决赛 AWDP [Break+Fix] Web方向题解wp 全
终于迎来了我的第一百篇文章。 这次决赛赛制是AWDP。BreakFix,其实就是CTFFix,Fix规则有点难崩。Break和Fix题目是一样的。 总结一下:败北,还是太菜了得继续修炼一下。 一、Break ezSSTI 看到是SSTI,焚靖直接一把梭…...
如何用好免费的ChatGPT
如何用好免费的ChatGPT 前言ChatGPT使用入口在线体验地址:点我体验 ChatGPT介绍ChatGPT初级使用技巧初级使用技巧:清晰明了的问题表达 ChatGPT中级使用语法中级使用语法:具体化问题并提供背景信息 ChatGPT高级使用高级使用:追问、…...
golang 实现带令牌限流的JWT demo
demo里提供了三个接口,认证取token,刷新token,获取信息,token过期前也会在header里写上新token(便于客户端更换) package mainimport ("fmt""net/http""sync""time&qu…...
【web开发】9、Django(4)ajax请求
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、Ajax是什么?二、使用步骤二、订单管理 提示:以下是本篇文章正文内容,下面案例可供参考 一、Ajax是什么? Ajax&…...
消息队列中,如何保证消息的顺序性?
本文选自:advanced-java 作者:yanglbme 问:如何保证消息的顺序性? 面试官心理分析 其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的…...
Shell别名的使用方法及管理技巧
文章目录 1. 引言1.1 概述1.2 目的1.3 适用范围 2. Shell和别名2.1 Shell简介2.2 别名的作用2.3 别名的语法 3. 创建别名3.1 临时别名3.2 永久别名 4. 别名的应用4.1 简化命令4.2 自定义命令4.3 提高工作效率 5. 管理别名5.1 查看别名5.2 修改别名5.3 删除别名 6. 实例演示6.1 …...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
6.9本日总结
一、英语 复习默写list11list18,订正07年第3篇阅读 二、数学 学习线代第一讲,写15讲课后题 三、408 学习计组第二章,写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语:复习l默写sit12list17&#…...
