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

数据结构----链式栈

目录

前言

链式栈

操作方式 

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.清空栈 完整代码 前言 前面我们学习过了数组栈的相关方法&#xff0c;&#xff08;链接&#xff1a;线性表-----栈&#xff08;栈…...

实在智能携手40+央企,探索财务大模型及数智化实践与应用

“这次培训给我一个最大的感触就是&#xff0c;过去以为AI智能化、大模型技术是很高深的事情。但现在&#xff0c;我们通过RPA等数字化工具&#xff0c;自主根据自己的工作岗位&#xff0c;完成业务自动化流程的开发和设计。AI技术没有想象中的那么难入门。” 这是一位参加了“…...

upload-labs文件上传1-5关

第一关 编写一句话木马1.php&#xff0c;编写完成后将后缀名修改为png 将1.png上传&#xff0c;上传时使用bp抓包 抓包后将后缀名修改为png 连接蚁剑 第二关 上传1.php&#xff0c;显示文件类型不正确 使用bp抓包发送重发器&#xff0c;修改文件后缀名后点击发送&#xff0c;…...

git的基本使用

查看当前分支 git branch //查看本地分支 git branch -a // 查看本地和远程的分支切分支 git checkout -b 分支的名字从当前分支切换到其他分支 拉取远程分支到本地 拉取远程develop分支代码到本地develop分支 git checkout -b develop origin/developgit merge B分支合并…...

Mac台式电脑内存清理方法教程

对于一些小白用户&#xff0c;如果觉得以上的清理方法比较复杂却又想要更好的优化Mac电脑内存&#xff0c;专业的系统清理软件是一个不错的选择。比起花几个小时时间浏览文件夹、删除临时文件、缓存和卸载残留。Cleanmymac X&#xff0c;只需单击几下即可完成所有内存清理工作&…...

FL Studio怎么破解?2023年最新FL Studio 21图文安装激活教程?FL 21中文版下载 v21.1.1.3750 汉化 版

fl studio21中文解锁特别破解版是一款功能强大的编曲软件&#xff0c;也就是众所熟知的水果软件。它可以编曲、剪辑、录音、混音&#xff0c;让您的计算机成为全功能录音室。除此之外&#xff0c;这款软件功能非常强大&#xff0c;为用户提供了许多音频处理工具&#xff0c;包含…...

Zookeeper高级_四字命令

之前使用stat命令来验证ZooKeeper服务器是否启动成功&#xff0c;这里的stat命令就是ZooKeeper 中最为典型的命令之一。ZooKeeper中有很多类似的命令&#xff0c;它们的长度通常都是4个英文字母&#xff0c;因此我们称之为“四字命令”。 添加配置 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时&#xff0c;如果提示这个信息。 先确认一下 有没有安装mysql-devel 执行如下命令 yum inst…...

折线图geom_line()参数选项

往期折线图教程 图形复现| 使用R语言绘制折线图折线图指定位置标记折线图形状更改 | 绘制动态折线图跟着NC学作图 | 使用python绘制折线图 前言 我们折线的专栏推出一段时间&#xff0c;但是由于个人的原因&#xff0c;一直未进行更新。那么今天&#xff0c;我们也参考《R语…...

百度SEO优化基本原理(掌握SEO基础,提高网站排名)

随着互联网的迅速发展&#xff0c;越来越多的企业开始意识到网站优化的重要性&#xff0c;其中百度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 高可用&#xff0c;两者的实现基本类似&#xff0c;但 HDFSNameNode 对数据存储及其一致性的要求比 YARN ResourceManger 高得多&#xff0c;所以它的实现也更加复杂 1、HDFS系统高可用简介…...

【计算机基础】让我们重新认识一下Visual Stduio及其操作,知识点汇总!!

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…...

使用Node构建私人代理池

在进行大规模数据采集时&#xff0c;经常会遇到网站反爬虫机制导致爬虫被封的问题。为了解决这个困扰&#xff0c;本文将向大家介绍如何利用Node.js构建私人代理池&#xff0c;提供稳定的代理&#xff0c;实现高效、可靠的爬虫操作。跟随本文一起学习&#xff0c;拥有解封爬虫的…...

2023年“羊城杯”网络安全大赛 决赛 AWDP [Break+Fix] Web方向题解wp 全

终于迎来了我的第一百篇文章。 这次决赛赛制是AWDP。BreakFix&#xff0c;其实就是CTFFix&#xff0c;Fix规则有点难崩。Break和Fix题目是一样的。 总结一下&#xff1a;败北&#xff0c;还是太菜了得继续修炼一下。 一、Break ezSSTI 看到是SSTI&#xff0c;焚靖直接一把梭…...

如何用好免费的ChatGPT

如何用好免费的ChatGPT 前言ChatGPT使用入口在线体验地址&#xff1a;点我体验 ChatGPT介绍ChatGPT初级使用技巧初级使用技巧&#xff1a;清晰明了的问题表达 ChatGPT中级使用语法中级使用语法&#xff1a;具体化问题并提供背景信息 ChatGPT高级使用高级使用&#xff1a;追问、…...

golang 实现带令牌限流的JWT demo

demo里提供了三个接口&#xff0c;认证取token&#xff0c;刷新token&#xff0c;获取信息&#xff0c;token过期前也会在header里写上新token&#xff08;便于客户端更换&#xff09; package mainimport ("fmt""net/http""sync""time&qu…...

【web开发】9、Django(4)ajax请求

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Ajax是什么&#xff1f;二、使用步骤二、订单管理 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Ajax是什么&#xff1f; Ajax&…...

消息队列中,如何保证消息的顺序性?

本文选自&#xff1a;advanced-java 作者&#xff1a;yanglbme 问&#xff1a;如何保证消息的顺序性&#xff1f; 面试官心理分析 其实这个也是用 MQ 的时候必问的话题&#xff0c;第一看看你了不了解顺序这个事儿&#xff1f;第二看看你有没有办法保证消息是有顺序的&#xf…...

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 …...

3分钟搞定APA第7版参考文献格式:Word用户终极解决方案

3分钟搞定APA第7版参考文献格式&#xff1a;Word用户终极解决方案 【免费下载链接】APA-7th-Edition Microsoft Word XSD for generating APA 7th edition references 项目地址: https://gitcode.com/gh_mirrors/ap/APA-7th-Edition 还在为学术论文的APA格式烦恼吗&…...

Mirage: The Illusion of Visual Understanding

Lab4AI大模型实验室是面向AI开发者、科研党与学习者打造的一站式AI实践平台&#xff0c;深度绑定高性能弹性算力&#xff0c;支持模型复现、训练、推理全流程&#xff0c;以按需计费、低价高效破解高端算力紧缺与成本高昂难题&#xff1b;同步Arxiv前沿论文并提供翻译、导读、分…...

从‘RIP’这道题出发,聊聊IDA分析PWN题时新手常踩的3个坑(附正确姿势)

从‘RIP’这道题出发&#xff0c;聊聊IDA分析PWN题时新手常踩的3个坑&#xff08;附正确姿势&#xff09; 在CTF竞赛中&#xff0c;PWN题往往是最考验选手底层功力的题型之一。而作为静态分析利器的IDA Pro&#xff0c;虽然功能强大&#xff0c;但新手在使用过程中常常会陷入一…...

论文写作“神器大比拼”:好写作AI凭实力“出圈”

在学术的漫漫征途中&#xff0c;论文写作就像是一场艰难的马拉松&#xff0c;从构思选题到组织内容&#xff0c;再到打磨润色&#xff0c;每一步都充满挑战。而如今&#xff0c;AI写作软件如雨后春笋般涌现&#xff0c;为论文写作者们带来了新的希望和助力。但面对琳琅满目的选…...

OpCore-Simplify:重构OpenCore EFI配置的效率革命工具

OpCore-Simplify&#xff1a;重构OpenCore EFI配置的效率革命工具 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 行业痛点分析&#xff1a;黑苹果配置…...

嵌入式必看学习路线

嵌入式学习路线第一阶段:C语言基础(必须扎实)数据类型&#xff1a;字符型&#xff08;char&#xff09;、短整型&#xff08;short&#xff09;、整型&#xff08;int&#xff09;、 长整型&#xff08;long&#xff09;、超长整形&#xff08;long long&#xff09;、&#xf…...

紧急预警:C++27 std::filesystem::copy_options::recursive_nowait 已被证实引发静默截断!附官方补丁+3行兼容封装方案(2025 Q2前必读)

第一章&#xff1a;C27 文件系统库扩展应用C27 标准对 <filesystem> 库进行了实质性增强&#xff0c;新增了异步路径遍历、符号链接元数据深度解析、跨设备硬链接原子创建以及基于策略的路径规范化接口。这些特性显著提升了在复杂存储拓扑&#xff08;如容器挂载点、分布…...

C语言实战:用栈结构解析括号匹配的三种典型错误

1. 为什么括号匹配是编程基本功 刚学C语言那会儿&#xff0c;我最怕遇到段错误(Segmentation Fault)。有次调试了整整两天&#xff0c;最后发现是少写了个右花括号。这种痛只有程序员才懂——括号就像代码的标点符号&#xff0c;漏一个整个程序就崩溃了。 用栈处理括号匹配之所…...

如何用Fuel构建类型安全的GraphQL客户端:终极完整指南

如何用Fuel构建类型安全的GraphQL客户端&#xff1a;终极完整指南 【免费下载链接】fuel The easiest HTTP networking library for Kotlin/Android 项目地址: https://gitcode.com/gh_mirrors/fu/fuel Fuel是Kotlin/Android平台上最简单易用的HTTP网络库&#xff0c;它…...

Python flask django框架的社区残障人士服务平台的设计与实现

目录同行可拿货,招校园代理 ,本人源头供货商功能模块设计用户管理模块服务匹配模块无障碍交互模块社区支持模块数据安全与后台管理技术实现要点Flask/Django选型对比数据库设计关键API示例&#xff08;Django&#xff09;无障碍前端适配部署与扩展项目技术支持源码获取详细视频…...