数据结构学习系列之链式栈
- 链式栈:
- 即:栈的
链式存储结构; - 分析:
- 为了提高程序的
运算效率,应采用头插法和头删法; - 进栈:
int push_link_stack(stack_t *link_stack,int data)
{if(NULL == link_stack){printf("入参合理性检查\n");return -1;}node_t *pnew = (node_t *)malloc(sizeof(node_t));if(NULL == pnew){printf("内存分配失败\n");return -1;}pnew->data = data;pnew->next = link_stack->top;link_stack->top = pnew;link_stack->count++;return 0;}
- 出栈:
int pop_link_stack(stack_t *link_stack,int *data)
{if(NULL == link_stack || NULL == data){printf("入参合理性检查\n");return -1;}if(link_stack_is_empty(link_stack)){printf("此时栈为空,出栈失败\n");return -1;}*data = link_stack->top->data;node_t *pdel = link_stack->top;link_stack->top = pdel->next;free(pdel);pdel = NULL;link_stack->count--;return 0;
}
- 示例代码:
- link_stack.h:
#ifndef __LINK_STACK_H__
#define __LINK_STACK_H__#include <stdio.h>
#include <stdlib.h>
#include <string.h>//链表结点的结构体
typedef struct NODE
{int data;struct NODE *next;}node_t;//链式栈的结构体typedef struct Link_stack
{unsigned int count;node_t *top;}stack_t;int create_link_stack(stack_t **link_stack);
int push_link_stack(stack_t *link_stack,int data);
int link_stack_is_empty(stack_t *link_stack);
int pop_link_stack(stack_t *link_stack,int *data);
int clean_link_stack(stack_t *link_stack);
int destory_link_stack(stack_t **link_stack);
int print_link_stack(stack_t *link_stack);#endif
- link_stack.c:
#include "link_stack.h"int create_link_stack(stack_t **link_stack)
{if(NULL == link_stack){printf("入参合理性检查\n");return -1;}*link_stack = (stack_t *)malloc(sizeof(stack_t));if(NULL == *link_stack){printf("内存分配失败\n");return -1;}memset(*link_stack,0,sizeof(stack_t));return 0;}//进栈
int push_link_stack(stack_t *link_stack,int data)
{if(NULL == link_stack){printf("入参合理性检查\n");return -1;}node_t *pnew = (node_t *)malloc(sizeof(node_t));if(NULL == pnew){printf("内存分配失败\n");return -1;}pnew->data = data;pnew->next = link_stack->top;link_stack->top = pnew;link_stack->count++;return 0;}
//判断栈是否为空
int link_stack_is_empty(stack_t *link_stack)
{if(NULL == link_stack){printf("入参合理性检查\n");return -1;}return link_stack->top == NULL ? 1 : 0;}
//出栈
int pop_link_stack(stack_t *link_stack,int *data)
{if(NULL == link_stack || NULL == data){printf("入参合理性检查\n");return -1;}if(link_stack_is_empty(link_stack)){printf("此时栈为空,出栈失败\n");return -1;}*data = link_stack->top->data;node_t *pdel = link_stack->top;link_stack->top = pdel->next;free(pdel);pdel = NULL;link_stack->count--;return 0;
}//清空栈
int clean_link_stack(stack_t *link_stack)
{if(NULL == link_stack){printf("入参合理性检查\n");return -1;}//循环头删node_t *pdel = NULL;while(link_stack->top != NULL){pdel = link_stack->top;link_stack->top = pdel->next;free(pdel);pdel = NULL;} link_stack->count = 0;return 0;}//销毁栈
int destory_link_stack(stack_t **link_stack)
{if(NULL == link_stack){printf("入参合理性检查\n");return -1;}clean_link_stack(*link_stack);free(*link_stack);*link_stack = NULL;return 0;
}//遍历栈中数据
int print_link_stack(stack_t *link_stack)
{if(NULL == link_stack){printf("入参合理性检查\n");return -1;}node_t *ptemp = link_stack->top;while(ptemp != NULL){printf("%d ",ptemp->data);ptemp = ptemp->next;}puts("");return 0;
}
- main.c:
#include "link_stack.h"int main(int argc, char const *argv[])
{stack_t *link_stack = NULL;create_link_stack(&link_stack);printf(" link_stack = %p\n", link_stack);// 进栈push_link_stack(link_stack, 22);push_link_stack(link_stack, 22);push_link_stack(link_stack, 11);push_link_stack(link_stack, 22);push_link_stack(link_stack, 22);push_link_stack(link_stack, 77);push_link_stack(link_stack, 22);print_link_stack(link_stack);// 出栈int data;pop_link_stack(link_stack, &data);printf("%d ", data);pop_link_stack(link_stack, &data);printf("%d ", data);pop_link_stack(link_stack, &data);printf("%d ", data);pop_link_stack(link_stack, &data);printf("%d ", data);pop_link_stack(link_stack, &data);printf("%d ", data);pop_link_stack(link_stack, &data);printf("%d ", data);pop_link_stack(link_stack, &data);printf("%d ", data);puts("");pop_link_stack(link_stack, &data);clean_link_stack(link_stack);print_link_stack(link_stack);destory_link_stack(&link_stack);printf(" link_stack = %p\n", link_stack);return 0;
}
- 运行结果:
link_stack = 0x564e05f39260
22 77 22 22 11 22 22
22 77 22 22 11 22 22
此时栈为空,出栈失败link_stack = (nil)
- 本示例代码仅供参考;
相关文章:
数据结构学习系列之链式栈
链式栈:即:栈的链式存储结构;分析:为了提高程序的运算效率,应采用头插法和头删法;进栈: int push_link_stack(stack_t *link_stack,int data) {if(NULL link_stack){printf("入参合理性检…...
too many session files in /var/tmp
Linux中Too many open files 问题分析和解决_e929: too many viminfo temp files-CSDN博客...
【7.0】打开未知来源安装应用
默认打开未知来源安装应用 frameworks\base\packages\SettingsProvider\res\values\defaults.xml <bool name"def_install_non_market_apps">false</bool>...
安装ipfs-swarm-key-gen
安装ipfs-swarm-key-gen Linux安装go解释器安装ipfs-swarm-key-gen Linux安装go解释器 https://blog.csdn.net/omaidb/article/details/133180749 安装ipfs-swarm-key-gen # 编译ipfs-swarm-key-gen二进制文件 go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm…...
BASH shell脚本篇5——文件处理
这篇文章介绍下BASH shell中的文件处理。之前有介绍过shell的其它命令,请参考: BASH shell脚本篇1——基本命令 BASH shell脚本篇2——条件命令 BASH shell脚本篇3——字符串处理 BASH shell脚本篇4——函数 在Bash Shell脚本中,可以使用…...
ElementUI之首页导航及左侧菜单(模拟实现)
目录 编辑 前言 一、mockjs简介 1. 什么是mockjs 2. mockjs的用途 3. 运用mockjs的优势 二、安装与配置mockjs 1. 安装mockjs 2. 引入mockjs 2.1 dev.env.js 2.2 prod.env.js 2.3 main.js 三、mockjs的使用 1. 将资源中的mock文件夹复制到src目录下 2. 点击登…...
Java开源工具库使用之Lombok
文章目录 前言一、常用注解1.1 AllArgsConstructor/NoArgsConstructor/RequiredArgsConstructor1.2 Builder1.3 Data1.4 EqualsAndHashCode1.5 Getter/Setter1.6 Slf4j/Log4j/Log4j2/Log1.7 ToString 二、踩坑2.1 Getter/Setter 方法名不一样2.2 Builder 不会生成无参构造方法2…...
uboot启动流程涉及reset函数
一. uboot启动流程中函数 之前了解了uboot链接脚本文件 u-boot.lds。 从 u-boot.lds 中我们已经知道了入口点是 arch/arm/lib/vectors.S 文件中的 _start。 本文了解 一下,uboot启动过程中涉及的 reset 函数。本文继上一篇文章学习,地址如下ÿ…...
端口被占用怎么解决
第一步:WinR 打开命令提示符,输入netstat -ano|findstr 端口号 找到占用端口的进程 第二步: 杀死使用该端口的进程,输入taskkill /t /f /im 进程号( !!!注意是进程号,不…...
python reportlab 生成多页pdf
多页 from reportlab.pdfgen import canvas from reportlab.platypus import (SimpleDocTemplate, Paragraph, PageBreak, Image, Spacer, Table, TableStyle) from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY from reportlab.lib.styles import P…...
word 多级目录的问题
一、多级标题自动编号 --> 制表符 -> 空格 网址: 【Word技巧】2 标题自动编号——将多级列表链接到样式 - YouTube 二、多级列表 --> 正规形式编号 网址:Word 教学 - 定框架:文档格式与多级标题! - YouTube 三、目…...
python使用mitmproxy和mitmdump抓包之拦截和修改包(四)
我认为mitmproxy最强大的地方,就是mitmdump可以结合python代理,灵活拦截和处理数据包。 首先,mitmdump的路径如下:(使用pip3 install mitmproxy安装的情况,参考我的文章python使用mitmproxy和mitmdump抓包…...
邓俊辉《数据结构》→ “2.6.5 二分查找(版本A)”之“成功查找长度”递推式推导
【问题描述】 邓俊辉的《数据结构(C语言版)(第3版)》(ISBN:9787302330646)中,开始于第48页的“2.6.5 二分查找(版本A)”内容在第50页详述了“成功查找长度”的…...
Linux文件查找,别名,用户组综合练习
1.文件查看: 查看/etc/passwd文件的第5行 [rootserver ~]# head -5 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi…...
【MATLAB第77期】基于MATLAB代理模型算法的降维/特征排序/数据处理回归/分类问题MATLAB代码实现【更新中】
【MATLAB第77期】基于MATLAB代理模型算法的降维/特征排序/数据处理回归/分类问题MATLAB代码实现 本文介绍基于libsvm代理模型算法的特征排序方法合集,包括: 1.基于每个特征预测精度进行排序(libsvm代理模型) 2.基于相关系数corr的…...
第三章 图标辅助元素的定制
第三章 图标辅助元素的定制 1.认识图表常用的辅助元素 图表的辅助元素是指除了根据数据绘制的图形之外的元素,常用的辅助元素包括坐标轴、标题、图例、网格、参考线、参考区域、注释文本和表格,它们都可以对图形进行补充说明。 上图中图表常用辅…...
【前端】ECMAScript6从入门到进阶
【前端】ECMAScript6从入门到进阶 1.ES6简介及环境搭建 1.1.ECMAScript 6简介 (1)ECMAScript 6是什么 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了。它的目标ÿ…...
Android Shape设置背景
设置背景时,经常这样 android:background“drawable/xxx” 。如果是纯色图片,可以考虑用 shape 替代。 shape 相比图片,减少资源占用,缩减APK体积。 开始使用。 <?xml version"1.0" encoding"utf-8"?…...
什么是GraphQL?它与传统的REST API有什么不同?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是GraphQL?⭐ 与传统的REST API 的不同⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣…...
如何定时备份使用Docker构建的MySQL容器中的数据库
👨🏻💻 热爱摄影的程序员 👨🏻🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…...
基于MCP协议的本地化地址数据处理工具:sthan-mcp-server深度解析
1. 项目概述:一个面向开发者的地址数据处理工具集最近在折腾一些需要处理用户地址信息的项目,比如电商、物流或者用户注册表单,发现地址数据的标准化和验证真是个老大难问题。用户输入五花八门,“北京市海淀区中关村大街1号”可能…...
不止同步:用群晖Docker+阿里云盘WebDAV,打造你的低成本异地备份方案
低成本数据容灾方案:群晖NAS与阿里云盘的深度整合实践 在数字化时代,数据安全已成为个人和小型工作室不可忽视的核心需求。传统备份方案往往面临成本高昂或操作复杂的困境——企业级云存储服务年费动辄上千元,而额外购置硬盘不仅需要前期投入…...
3步免费查询:手机号快速查找QQ号的终极Python工具指南
3步免费查询:手机号快速查找QQ号的终极Python工具指南 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾因忘记老同学的QQ号而无法联系?或者需要验证某个手机号是否关联QQ账号?phone2qq这个…...
终极指南:如何通过5个步骤实现Zotero PDF翻译的学术效率革命
终极指南:如何通过5个步骤实现Zotero PDF翻译的学术效率革命 【免费下载链接】zotero-pdf-translate Translate PDF, EPub, webpage, metadata, annotations, notes to the target language. Support 20 translate services. 项目地址: https://gitcode.com/gh_mi…...
FPGA高速收发器CDR模块深度解析:从NRZ码中“捞出”时钟的RXOUTCLKPMA是怎么工作的?
FPGA高速收发器CDR模块技术探秘:解码NRZ数据中的时钟玄机 在高速数字通信系统中,时钟数据恢复(CDR)技术如同一位技艺精湛的侦探,能够从看似杂乱无章的NRZ(非归零码)数据流中,精准地&…...
阿里云第一季营收416亿:EBITA为38亿 同比增57%
雷递网 乐天 5月13日阿里巴巴(美股代码:“baba”,港股代号:9988)今日发布2026年第一季度的财报。财报显示,阿里2026年第一季度营收为2433.8亿元(352.83亿美元),同比增长3…...
HiveWE:现代化魔兽争霸III地图编辑器完全指南
HiveWE:现代化魔兽争霸III地图编辑器完全指南 【免费下载链接】HiveWE A Warcraft III world editor. 项目地址: https://gitcode.com/gh_mirrors/hi/HiveWE 还在为魔兽争霸III原版地图编辑器缓慢的加载速度和复杂的操作而烦恼吗?HiveWE作为一款专…...
ClawPaw:将Android手机转化为AI智能体的可编程执行节点
1. 项目概述:ClawPaw,一个将手机变成AI智能体的“手”与“眼” 如果你正在探索AI智能体(Agent)如何与现实世界交互,或者想让你的自动化脚本、个人助手能直接操作你的手机,那么ClawPaw这个项目绝对值得你花…...
使用S32 Design Studio(S32DS)常见问题
S32DS常见问题如下:1. 编译器找不到ld文件工程路径不能有中文字符2. 编译器找不到make文件鼠标右键点击工程,在弹出菜单中点击 “Properties” 按钮,弹出属性对话框,点击 Tool Settings 选项卡,在左侧树状框中点击 C/C…...
PLINK实战:如何用--het和--hardy参数快速筛查异常样本与SNP位点
PLINK实战:基因组数据质控中的杂合度与哈迪-温伯格平衡分析技巧 拿到测序数据的第一天,实验室新来的博士生盯着满屏的PLINK报表面露难色——那些F值、P值究竟在说什么?为什么隔壁组的文章用0.2过滤杂合度,而合作方坚持要用0.1&…...
