【数据结构】栈的实现(链式栈)

文章目录

  • 栈的实现(链式栈)
    • 栈的定义
    • 初始化栈
    • 进栈
    • 判断是否为空栈
    • 出栈
    • 销毁栈
    • 获取栈顶元素
    • 获取栈的长度
    • 栈的打印
  • 完整代码(包括测试代码)
    • Stack.h
    • Stack.c
    • test.c

栈的实现(链式栈)

首先新建一个工程:

Stack.h(链式栈的类型定义、接口函数声明、引用的头文件)
Stack.c(链式栈接口函数的实现)
test.c(主函数、测试栈各个接口功能)

完整的代码放在后面(包括测试代码),这里就不会展示测试的效果图。大家可以自己别敲边按测试代码测试。图解会写的很详细的,么么😙

栈的定义

typedef int ElemType;		/* 链栈结点结构 */
typedef struct StackNode
{ElemType data;struct StackNode* next;
}StackNode;/* 链栈结构 */
typedef struct
{StackNode* top;int count;
}LinkStack;

初始化栈

在这里插入图片描述

// 初始化栈
LinkStack* Init()
{// 注意要给链栈分配内存LinkStack* p = (LinkStack*)malloc(sizeof(LinkStack));if (p == NULL){perror("malloc fail");exit(-1);}p->top = NULL; // 链栈的空其实就是 top=NULL 的时候p->count = 0;return p;
}

进栈

在这里插入图片描述

// 进栈
void push(LinkStack* stack, ElemType x)
{assert(stack);StackNode* s = (StackNode*)malloc(sizeof(StackNode));if (s ==NULL){perror("malloc fail");exit(-1);}s->data = x;s->next = stack->top; stack->top = s; stack->count++;
}

判断是否为空栈

这里可以用count是否等于0判断,也可以用stack->top=NULL来判断都可以。

// 判断是否为空栈
bool isEmpty(LinkStack* stack)
{assert(stack);return  stack->count == 0;
}

出栈

在这里插入图片描述

// 出栈
void pop(LinkStack* stack)
{assert(stack);if (isEmpty(stack))return ;StackNode* q = stack->top;stack->top = stack->top->next;free(q); q = NULL;stack->count--;}

销毁栈

这里需要二级指针才能置空stack,但是我为了整体的美观,我们这里每次使用完后,在函数外面主动置空 plist。

// 销毁栈
void destroy(LinkStack* stack)
{assert(stack);StackNode* p = stack->top;StackNode* q;while (p){q = p;p = p->next;free(q);}stack->count = 0;q = NULL;free(stack);//stack = NULL;//需要主动释放置空,不然要使用二级指针}

获取栈顶元素

// 获取栈顶元素
ElemType getTop(LinkStack* stack)
{assert(stack);if (stack->top == NULL)exit(-1);elsereturn 	stack->top->data;}

获取栈的长度

// 获取栈的长度
int getLength(LinkStack* stack)
{assert(stack);return stack->count;
}

栈的打印

同顺序栈一样写在测试test.c文件中。

完整代码(包括测试代码)

Stack.h

#pragma once
#include<stdio.h>	
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int ElemType;		/* 链栈结点结构 */
typedef struct StackNode
{ElemType data;struct StackNode* next;
}StackNode;/* 链栈结构 */
typedef struct
{StackNode* top;int count;
}LinkStack;// 初始化栈
LinkStack* Init();
// 进栈
void push(LinkStack* stack, ElemType x);
// 判断是否为空栈
bool isEmpty(LinkStack* stack);
// 出栈
void pop(LinkStack* stack);
// 销毁栈
void destroy(LinkStack* stack);
// 获取栈顶元素
ElemType getTop(LinkStack* stack);
// 获取栈的长度
int getLength(LinkStack* stack);

Stack.c

#define _CRT_SECURE_NO_WARNINGS 1#include"Stack.h"// 初始化栈
LinkStack* Init()
{// 注意要给链栈分配内存LinkStack* p = (LinkStack*)malloc(sizeof(LinkStack));if (p == NULL){perror("malloc fail");exit(-1);}p->top = NULL; // 链栈的空其实就是 top=NULL 的时候p->count = 0;return p;
}// 进栈
void push(LinkStack* stack, ElemType x)
{assert(stack);StackNode* s = (StackNode*)malloc(sizeof(StackNode));if (s ==NULL){perror("malloc fail");exit(-1);}s->data = x;s->next = stack->top; stack->top = s; stack->count++;
}// 判断是否为空栈
bool isEmpty(LinkStack* stack)
{assert(stack);return  stack->count == 0;
}// 出栈
void pop(LinkStack* stack)
{assert(stack);if (isEmpty(stack))return ;StackNode* q = stack->top;stack->top = stack->top->next;free(q); q = NULL;stack->count--;}// 销毁栈
void destroy(LinkStack* stack)
{assert(stack);StackNode* p = stack->top;StackNode* q;while (p){q = p;p = p->next;free(q);}stack->count = 0;q = NULL;free(stack);//stack = NULL;//需要主动释放置空,不然要使用二级指针}// 获取栈顶元素
ElemType getTop(LinkStack* stack)
{assert(stack);if (stack->top == NULL)exit(-1);elsereturn 	stack->top->data;}// 获取栈的长度
int getLength(LinkStack* stack)
{assert(stack);return stack->count;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"int main()
{LinkStack* plist = Init();push(plist, 1);push(plist, 2);push(plist, 3);push(plist, 4);push(plist, 5);while (!isEmpty(plist)){printf("%d ", getTop(plist));pop(plist);}printf("\n");int len=getLength(plist);printf("%d\n", len);bool b = isEmpty(plist);if (b){printf("true\n");}else{printf("false\n");}destroy(plist);//主动置空plist = NULL;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1424047.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

SAP BSEG VS ACDOCA 差异

温习一下 ACDOCA VS BSEG matinal&#xff1a;S4 HANA 详解ACDOCA与BSEG的区别都在这了_sap acdoca-CSDN博客

如何实现Linux双网卡同时连接内网和外网的配置?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

2023年国赛高教杯数学建模B题多波束测线问题解题全过程文档及程序

2023年国赛高教杯数学建模 B题 多波束测线问题 原题再现 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀速直线传播&#xff0c;在不同界面上产生反射&#xff0c;利用这一原理&#xff0c;从测量船换能器垂直向海底发射声波信号&#xff…

【Kafka】2.深入理解Kafka事件流平台及其核心概念

1.事件流(Event streaming) 事件流是人体中枢神经系统的数字化的等价物。它是构建“始终在线”世界的技术基础&#xff0c;在这个世界中&#xff0c;企业越来越多地被定义为软件化和自动化&#xff0c;而软件的用户本身也是软件。 从技术上讲&#xff0c;事件流是从数据库、传…

regsvr32 注册报错

问题一&#xff1a; 1&#xff1a;解决办法&#xff0c;先通过dumpbin /imports 动态库名称 查看动态库依赖 2&#xff1a;查看动态库是32位还是64位&#xff0c;使用notepad打开exe文件&#xff08;dll文件&#xff09;&#xff0c;会有很多乱码&#xff0c;不要头疼&#xf…

关于大漠6.1544和谐版本的那些事

今天群里有人说&#xff0c;网络有这个版本的和谐版本&#xff0c;我就去淘宝花巨款买了1个来测试&#xff0c;下面把测试的结果聊一聊。 1&#xff0c;6.1544 属于很早的版本&#xff0c;发布时间应该是1998年&#xff1f;&#xff1f;属于老古董。 2&#xff0c;查看对应的大…

idea SpringBoot + Gradle 打成zip包(包含配置文件等)

前言&#xff1a; 通过上一文章&#xff0c;我们可以通过ideagradle 构建Springboot项目并实现打成jar包&#xff0c;本文章测试通过gradle 打包成zip包并包含启动文件、配置文件等信息&#xff1b;可点击此处查看idea SpringBoot Gradle 环境配置到项目打包-CSDN博客 一、工…

上海市虹桥祥源希尔顿酒店屋顶气膜网球馆

上海市虹桥祥源希尔顿酒店屋顶气膜网球馆为高端酒店设施增添了现代化、环保的运动场所。这座网球馆不仅为酒店住客提供了一个全天候、舒适的运动空间&#xff0c;也为虹桥地区的居民带来了全新的健身体验。作为轻空间&#xff08;江苏&#xff09;膜科技有限公司&#xff08;以…

Django创建网站的地基

相关文档 1、为新网站创建一个文件夹&#xff08;这里是&#xff1a;locallibrary&#xff09; D:\django>mkdir locallibraryD:\django>cd locallibraryD:\django\locallibrary>dirVolume in drive D is 新加卷Volume Serial Number is B68C-03F7Directory of D:\dj…

CF 944 (Div. 4) A~G

文章目录 A My First Sorting Problem&#xff08;模拟&#xff09;B Different String(模拟、字符串)C Clock and Strings&#xff08;模拟&#xff09;D Binary Cut &#xff08;贪心&#xff09;E Find the Car&#xff08;二分查找、数学&#xff09;F Circle Perimeter&am…

QT状态机2-含终止状态的嵌套状态机

#include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)

续篇——源码部署LAMP环境上线——禅道项目

上篇:LNMP环境部署WordPress——使用源码包安装方式部署环境-CSDN博客 目录 一.前提准备 1. 名词区别 2. 下载项目软件包 3. 上传项目源码到虚拟机并解压 二.安装Apache 1. 环境清理 2.关闭Nginx 3. 下载Apache 4. 下载APR组件 4.1 安装apr 4.2 安装apr-util组件 5…

【PDF技巧】PDF如何解密?

PDF文件设置了加密&#xff0c;需要密码才能够打开文件或者编辑文件&#xff0c;那么如何解密PDF密码&#xff1f;今天我们来一起学习一下。 首先是在已知密码的情况下&#xff0c;PDF文件中的打开密码或者是限制编辑&#xff0c;想要解密PDF密码&#xff0c;我们只需要在PDF编…

RSC6218A LLC谐振电源案例分享-REASUNOS(瑞森半导体)

一、前言 RSC6218A是一款可以满足4项标准的优秀产品&#xff1a;①2024年8月1日要实施的《建筑照明设计标准》GBT0034-2024&#xff1b;②2024年07月01日起实施的《电磁兼容限值 第1部分&#xff1a;谐波电流发射限值&#xff08;设备每相输入电流≤16A&#xff09;》GB17625.…

【Redis】数据类型

Redis数据类型&#xff08;5 3 1&#xff09; 五种基本数据类型 String字符串 特点 二进制安全&#xff0c;可以包含任何数据&#xff0c;如数字&#xff0c;字符串&#xff0c;jpg图片或者序列化的对象 应用场景 缓存&#xff1a; redis作为缓存层&#xff0c;mysql做持…

webpack5零基础入门-14提取css为单独文件

1.背景 Css文件目前被打包到JS文件中&#xff0c;当JS文件加载时&#xff0c;会尝试创建一个style标签来生成样式&#xff0c;这样对于网站来说&#xff0c;会出现闪屏的现象&#xff0c;用户体验不好。我们应该是单独的Css文件&#xff0c;通过link标签来加载性能才好。 2.下…

提升写作效率的秘密武器:一个资深编辑的AI写作体验

有句话说:“写作是一项你坐在打字机前流血的工作。”而如今,各类生成式软件的涌现似乎打破了写作这一古老的艺术形式壁垒。过去,作家们独自在书桌前冥思苦想,如今,一款名为“玲珑AI工具”的ai写作助手正悄然改变着文案写作行业的创作生态,成为提升写作效率的秘密武器。 在传统…

使用make_blobs生成数据并使用KNN机器学习算法进行分类和预测以及可视化

生成数据 使用make_blobs生成数据并使用matplotlib进行可视化 完整代码&#xff1a; from sklearn.datasets import make_blobs # KNN 分类器 from sklearn.neighbors import KNeighborsClassifier # 画图工具 import matplotlib.pyplot as plt # 数据集拆分工具 from sklea…

三无跨考,上岸热门211?

这个系列会邀请上岸学长学姐进行经验分享~ 今天分享经验的同学也是梦马班的学员&#xff0c;一战高分上岸福州大学&#xff01; 经验分享 一战零基础跨考福州大学866&#xff0c;初试395&#xff0c;信号141&#xff0c;最后本部录取排名前十。各位要报考福州大学的学弟学妹…