数据结构(四)顺序栈 链式栈
一、概念
栈是一种先进后出的数据结构。FILO(firt in late out)
逻辑结构:线性结构
二、存储结构:
(一) 顺序存储
顺序栈
基于一个数组配合一个栈顶"指针(数组下标)–top"
顺序栈的本质就是对顺序表操作的一种约束:只能在一端进行插入和删除。
操作:
创建
清空
销毁
入栈、压栈——判断栈满
出栈、弹栈——判断栈空
打印栈所有元素
(二)链式存储
1. 结构体定义
//链表节点结构体----数据元素
typedef struct _Node{int data;struct _Node *next;
}node_t;//链式栈的结构体----数据对象
typedef struct _Stack{node_t *top;int count;//记录栈中元素个数//.....其他属性信息
}stack_t;
2.创建栈表
(1)函数定义
int create_stack(stack_t **my_stack);
- 在内存中申请一块stack_t类型大小的空间存储栈的内容;
- 初始化栈的成员的数据:将count置0,top置NULL
(2)注意点
- 进入函数就需要判断传入的参数是否为NULL,为空退出函数
- 在申请完内存空间后判断,申请空间是否成功,失败退出函数
(3)代码实现
int create_stack(stack_t **my_stack){if(NULL==my_stack) //判断传入参数是否为空{return -1;}*my_stack=(stack_t *)malloc(sizeof(stack_t));if(NULL==*my_stack){return -1;}//初始化(*my_stack)->top=NULL;(*my_stack)->count=0;return 0;
}
3. 入栈
(1)函数定义
int push_stack(stack_t *my_stack, int data);
- 在内存中申请一块node_t类型大小的数据空间
- 进行头插
- count自加一
(2)注意点
- 需要检查传入参数是否为空,为空退出函数
- top指向的元素即是第一个数据节点
(3)代码实现
int push_stack(stack_t *my_stack, int data){if(NULL==my_stack){return -1;}//申请一个新数据节点node_t *node=(node_t *)malloc(sizeof(node_t));if(NULL==node){return -1;}node->next=my_stack->top;my_stack->top=node;node->data=data;my_stack->count++;return 0;
}
3. 出栈
(1)函数定义
int pop_stack(stack_t *my_stack, int *num);
- 头删
- count自减
(2)注意点
- 需要检查传入指针参数和*num是否为空,为空退出函数
- 检查栈是否为空,为空退出函数
(3)代码实现
//出栈
int pop_stack(stack_t *my_stack, int *num){if(NULL==my_stack||NULL==num){return -1;}if(is_empty(my_stack)){return -1;}//头删node_t *pdel=my_stack->top;*num=pdel->data;my_stack->top=pdel->next;free(pdel);pdel=NULL;my_stack->count--;return 0;
}
4. 判断栈是否为空
(1)函数定义
int is_empty(stack_t *my_stack);
(2)注意点
- 判断传入的指针参数是否为空
(3)代码实现
int is_empty(stack_t *my_stack){if(NULL==my_stack){return -1;}return (my_stack->count)?0:1;
}
5. 清空栈
(1)函数定义
int clean_stack(stack_t *my_stack);
- 循环头删
- count置0
- 只要top的指向不为空,就一直循环
(2)注意点
- 入参合理性检查
- count不要忘记置0
(3)代码实现
int clean_stack(stack_t *my_stack){if(NULL==my_stack){return -1;}node_t *pdel=NULL;while(my_stack->top){pdel=my_stack->top;my_stack->top=pdel->next;free(pdel);}pdel=NULL;my_stack->count=0;return 0;
}
6. 销毁栈
(1)函数定义
int destroy_stack(stack_t **my_stack);
(2)注意点
(3)代码实现
int destroy_stack(stack_t **my_stack){if(NULL==my_stack||NULL==*my_stack){return -1;}//先清空再销毁if(clean_stack(*my_stack)){return -1;}free(*my_stack);*my_stack=NULL;return 0;
}
7. 打印栈
(1)函数定义
int print_stack(stack_t *my_stack);
(2)注意点
- 入参合理性检查
(3)代码实现
int print_stack(stack_t *my_stack){if(NULL==my_stack){return -1;}if(is_empty(my_stack)){printf("栈空\n");return -1;}node_t *ptemp=my_stack->top;for(int i=0;i<my_stack->count;i++){printf("%d ",ptemp->data);ptemp=ptemp->next;}putchar(10);return 0;
}
相关文章:
数据结构(四)顺序栈 链式栈
一、概念 栈是一种先进后出的数据结构。FILO(firt in late out) 逻辑结构:线性结构 二、存储结构: (一) 顺序存储 顺序栈 基于一个数组配合一个栈顶"指针(数组下标)–top" 顺序栈的本质就是对…...
【linux】g++/gcc编译器
目录 背景知识 gcc如何完成 预处理(进行宏替换) 编译(生成汇编) 汇编(生成机器可识别代码) 链接(生成可执行文件或库文件) 在这里涉及到一个重要的概念:函数库 函数库一般分为静态库和动态库两…...
VBA批量合并带有图片、表格与文本框的Word
本文介绍基于VBA语言,对大量含有图片、文本框与表格的Word文档加以批量自动合并,并在每一次合并时添加分页符的方法。 在我们之前的文章基于Python中docx与docxcompose批量合并多个Word文档文件并逐一添加分页符(https://blog.csdn.net/zhebu…...
市面上前 11 名的 Android 数据恢复软件
Android数据恢复软件是恢复无意中删除的文件或文件夹的必要工具。该软件还将帮助您恢复丢失或损坏的信息。本文介绍提供数据备份和磁盘克隆选项的程序,这些选项有助于在Android设备上恢复文件的过程。 如果您正在寻找一种有效的方法来恢复图像,文档&…...
【数据结构与算法 | 基础篇】数组模拟栈
1. 前言 前文我们刚提及了如何用单向链表来模拟栈. 我们还可以用数组来模拟栈.使用栈顶指针top来进行栈顶的操作. 2. 数组模拟栈 (1). 栈接口 public interface stack<E> {//压栈boolean push(E value);//弹栈, 栈非空返回栈顶元素E pop();//返回栈顶元素, 但不弹栈E…...
css卡片横线100%宽度
所需样式: 横线不用border, 用单独一个div, 这样就不会影响父组件的padding <div class"pumpDetailView"><div class"pump_title_name"><span>{{ pumpInfo.pointname }}</span><divclass"point_state":style"…...
回溯大法总结
前言 本篇博客将分两步来进行,首先谈谈我对回溯法的理解,然后通过若干道题来进行讲解,最后总结 对回溯法的理解 回溯法可以看做蛮力法的升级版,它在解决问题时的每一步都尝试所有可能的选项,最终找出所以可行的方案…...
基于Android Studio图书管理,图书借阅系统
目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 用户 书架:搜索书籍,查看书籍,借阅书籍,收藏书籍,借阅书籍必须在一个月之内还书; 我的:可以修改密码,退出登录ÿ…...
SCSS 基本使用详解
一、引言 SCSS 是 Sass(Syntactically Awesome Stylesheets)的其中一种语法,是一种预处理器脚本语言,能够扩展 CSS 的功能,使其更加强大和高效。SCSS 保留了 CSS 的原有语法,同时增加了变量、嵌套规则、混…...
10.3.k8s的附加组件-图形化管理工具dashboard
目录 一、dashboard介绍 二、部署安装dashboard组件 1.下载dashboard本地文件 2.修改nodeport的端口范围 3.创建和查看dashboard 4.电脑浏览器访问测试 5.token登录方式登录dashboard 5.1.查看dashboard的token 5.2.继续查看用户token的secrets资源详细信息 5.3.复制…...
深入理解CPU缓存一致性
存储体系结构 速度快的存储硬件成本高、容量小,速度慢的成本低、容量大。为了权衡成本和速度,计算机存储分了很多层次,有寄存器、L1 cache、L2 cache、L3 cache、主存(内存)和硬盘等。 根据程序的空间局部性和时间局…...
python获取安装路径盘符
文章目录 一、前言二、实现方法一、前言 python写的客户端工具需要安装时,可以给用户一个默认的安装路径,如果直接写死个D、E、F盘什么的,那用户可能没有那个盘符,但是如果直接指定系统盘C盘,又不是那么友好,所以默认指定的安装路径应该尽量满足下面的要求: 盘符存在盘…...
CentOS 7.9安装NVIDIA P40显卡驱动、CUDA和cuDNN
文章目录 1、安装P40显卡驱动1.1 查看机器上有哪些显卡1.2 禁用nouveau1.3 安装依赖1.4 安装驱动 2、安装CUDA2.1 安装2.2 测试是否安装成功 3、安装cuDNN3.1 安装3.2 测试是否安装成功 4、总结 1、安装P40显卡驱动 1.1 查看机器上有哪些显卡 lspci | grep -i vga lspci | gr…...
SpringBoot多数据源启动出现循环依赖问题
在使用SpringBoot的项目中,如果是有使用多数据源,可能会存在启动时数据源循环依赖的报错,是因为使用了多数据源注入,和DataSourceAutoConfiguration数据源自动配置的DataSourceInitializerInvoker互相产生循环依赖导致。 这种错误…...
【一步一步了解Java系列】:何为数组,何为引用类型
看到这句话的时候证明:此刻你我都在努力加油陌生人个人主页:Gu Gu Study专栏:一步一步了解Java 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 数组 数组是一推相同数据…...
2024年5月份最新独角数卡使用USDT详细小白教程
直观配套视频教程 2024年5月份最新独角数卡安装及USDT使用详细小白教程 1、创建服务器 Centos或者Ubuntu2、宝塔面板开心版安装寶塔 Linux 面版 8.0.5 開心版 - 2024年1月12日 - 开心专区 - 异次元 - Powered by Discuz!Centos安装命令(默认安装是 8.0.1 直接在线升…...
【idea】idea2024最新版本下载_安装_破解
1、下载 下载地址:下载 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 下载完成: idea破解脚本下载链接:https://pan.baidu.com/s/1L5qq26cRABw8XuEn_CngKQ 提取码:6666 下载完成: 2、安装 1、双击idea的安装包&…...
部署CNI网络组件+k8s多master集群部署+负载均衡
一、环境部署 主机服务 192.168.91.5 K8S集群master01192.168.91.8 K8S集群master02192.168.91.6K8S集群node01192.168.91.7K8S集群node02192.168.91.9 负载均衡nginxkeepalive01(master)192.168.91.10 负载均衡nginxkeepalive02(backup&am…...
一个和蔼可亲的Python库,用Gooey为你的程序添加GUI
大家好,你有没有遇到过这样的情况:你写了一个非常棒的命令行程序,但当你分享给朋友或同事时,他们却因为害怕命令行而不愿意使用?这时候,一个简洁美观的图形用户界面(GUI)就派上用场了…...
java抽象类,接口,枚举练习题
第一题: 答案: class Animal{//成员变量protected String name;protected int weight;//构造方法public Animal(){this.name"refer";this.weight50;}public Animal(String name,int weight){this.namename;this.weightweight;}//成员方法publ…...
BALM2深度解析 | 港大MARS实验室如何用点簇革新激光BA?
1. 激光BA的痛点与BALM2的突破 激光SLAM领域一直面临一个核心难题:如何高效处理海量点云数据的同时保证位姿估计的精度?传统激光BA(Bundle Adjustment)方法在处理大规模场景时,往往陷入计算资源的泥潭。我曾在实际项目…...
Legacy iOS Kit终极指南:旧款iOS设备降级、越狱与恢复完整教程
Legacy iOS Kit终极指南:旧款iOS设备降级、越狱与恢复完整教程 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...
AMD SMT补丁实战指南:突破《赛博朋克2077》CPU性能瓶颈
AMD SMT补丁实战指南:突破《赛博朋克2077》CPU性能瓶颈 【免费下载链接】CyberEngineTweaks Cyberpunk 2077 tweaks, hacks and scripting framework 项目地址: https://gitcode.com/gh_mirrors/cy/CyberEngineTweaks 《赛博朋克2077》自发布以来,…...
Python结合OCR技术实现高效发票信息提取与自动化处理
1. 为什么需要自动提取发票信息? 每次月底整理报销单据的时候,你是不是也经常对着堆积如山的发票发愁?一张张手动录入发票号码、金额、开票日期,不仅效率低下还容易出错。我去年在一家电商公司做财务系统优化时,发现财…...
自动驾驶模拟平台模型配置全指南:从技术选型到场景验证
自动驾驶模拟平台模型配置全指南:从技术选型到场景验证 【免费下载链接】alpasim 项目地址: https://gitcode.com/GitHub_Trending/al/alpasim 一、AlpaSim核心价值:构建自动驾驶研发闭环 AlpaSim作为开源自动驾驶模拟平台,通过模块…...
【自然语言处理】BERTopic:解决文本主题分析的5个创新方案
#【自然语言处理】BERTopic:解决文本主题分析的5个创新方案 【免费下载链接】BERTopic Leveraging BERT and c-TF-IDF to create easily interpretable topics. 项目地址: https://gitcode.com/gh_mirrors/be/BERTopic 在信息爆炸的时代,如何从海…...
4个维度揭秘Unreal VDB插件技术解析与架构优化
4个维度揭秘Unreal VDB插件技术解析与架构优化 【免费下载链接】unreal-vdb This repo is a non-official Unreal plugin that can read OpenVDB and NanoVDB files in Unreal. 项目地址: https://gitcode.com/gh_mirrors/un/unreal-vdb Unreal VDB插件作为连接OpenVDB/…...
可视化拖拽组件库终极指南:响应式设计与适配方案完整解析
可视化拖拽组件库终极指南:响应式设计与适配方案完整解析 【免费下载链接】visual-drag-demo 一个低代码(可视化拖拽)教学项目 项目地址: https://gitcode.com/gh_mirrors/vi/visual-drag-demo 可视化拖拽组件库是现代低代码开发平台的…...
从RNN到Mamba:一个算法工程师的‘长文本’建模踩坑与选型指南
从RNN到Mamba:一个算法工程师的‘长文本’建模踩坑与选型指南 当处理长达数万token的日志序列时,传统RNN的梯度消失问题让模型难以捕捉跨时段的异常模式,而Transformer的二次方复杂度又让显存迅速耗尽。这种困境促使我开始系统评估结构化状态…...
Magisk系统权限架构深度解析:Android设备Root权限优雅解决方案
Magisk系统权限架构深度解析:Android设备Root权限优雅解决方案 【免费下载链接】Magisk The Magic Mask for Android 项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk Magisk作为Android系统权限管理领域的革命性工具,通过独特的系统化…...
