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

数据结构学习系列之链式栈

  • 链式栈:
  • 即:栈的链式存储结构;
  • 分析:
  • 为了提高程序的运算效率,应采用头插法头删法
  • 进栈:
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)
  • 本示例代码仅供参考;

相关文章:

数据结构学习系列之链式栈

链式栈&#xff1a;即&#xff1a;栈的链式存储结构&#xff1b;分析&#xff1a;为了提高程序的运算效率&#xff0c;应采用头插法和头删法&#xff1b;进栈&#xff1a; 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的其它命令&#xff0c;请参考&#xff1a; BASH shell脚本篇1——基本命令 BASH shell脚本篇2——条件命令 BASH shell脚本篇3——字符串处理 BASH shell脚本篇4——函数 在Bash Shell脚本中&#xff0c;可以使用…...

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。 本文了解 一下&#xff0c;uboot启动过程中涉及的 reset 函数。本文继上一篇文章学习&#xff0c;地址如下&#xff…...

端口被占用怎么解决

第一步&#xff1a;WinR 打开命令提示符&#xff0c;输入netstat -ano|findstr 端口号 找到占用端口的进程 第二步&#xff1a; 杀死使用该端口的进程&#xff0c;输入taskkill /t /f /im 进程号&#xff08; &#xff01;&#xff01;&#xff01;注意是进程号&#xff0c;不…...

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 多级目录的问题

一、多级标题自动编号 --> 制表符 -> 空格 网址&#xff1a; 【Word技巧】2 标题自动编号——将多级列表链接到样式 - YouTube 二、多级列表 --> 正规形式编号 网址&#xff1a;Word 教学 - 定框架&#xff1a;文档格式与多级标题&#xff01; - YouTube 三、目…...

python使用mitmproxy和mitmdump抓包之拦截和修改包(四)

我认为mitmproxy最强大的地方&#xff0c;就是mitmdump可以结合python代理&#xff0c;灵活拦截和处理数据包。 首先&#xff0c;mitmdump的路径如下&#xff1a;&#xff08;使用pip3 install mitmproxy安装的情况&#xff0c;参考我的文章python使用mitmproxy和mitmdump抓包…...

邓俊辉《数据结构》→ “2.6.5 二分查找(版本A)”之“成功查找长度”递推式推导

【问题描述】 邓俊辉的《数据结构&#xff08;C语言版&#xff09;&#xff08;第3版&#xff09;》&#xff08;ISBN&#xff1a;9787302330646&#xff09;中&#xff0c;开始于第48页的“2.6.5 二分查找&#xff08;版本A&#xff09;”内容在第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代理模型算法的特征排序方法合集&#xff0c;包括&#xff1a; 1.基于每个特征预测精度进行排序&#xff08;libsvm代理模型&#xff09; 2.基于相关系数corr的…...

第三章 图标辅助元素的定制

第三章 图标辅助元素的定制 1.认识图表常用的辅助元素 ​ 图表的辅助元素是指除了根据数据绘制的图形之外的元素&#xff0c;常用的辅助元素包括坐标轴、标题、图例、网格、参考线、参考区域、注释文本和表格&#xff0c;它们都可以对图形进行补充说明。 ​ 上图中图表常用辅…...

【前端】ECMAScript6从入门到进阶

【前端】ECMAScript6从入门到进阶 1.ES6简介及环境搭建 1.1.ECMAScript 6简介 &#xff08;1&#xff09;ECMAScript 6是什么 ECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准&#xff0c;已经在2015年6月正式发布了。它的目标&#xff…...

Android Shape设置背景

设置背景时&#xff0c;经常这样 android:background“drawable/xxx” 。如果是纯色图片&#xff0c;可以考虑用 shape 替代。 shape 相比图片&#xff0c;减少资源占用&#xff0c;缩减APK体积。 开始使用。 <?xml version"1.0" encoding"utf-8"?…...

什么是GraphQL?它与传统的REST API有什么不同?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是GraphQL&#xff1f;⭐ 与传统的REST API 的不同⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣…...

如何定时备份使用Docker构建的MySQL容器中的数据库

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...