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

文章目录

  • 栈的实现(链式栈)
    • 栈的定义
    • 初始化栈
    • 进栈
    • 判断是否为空栈
    • 出栈
    • 销毁栈
    • 获取栈顶元素
    • 获取栈的长度
    • 栈的打印
  • 完整代码(包括测试代码)
    • 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);
	else
	   return 	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);
	else
	   return 	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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SHAP - 解释机器学习

文章目录 一、关于 SHAP二、安装三、树集成示例&#xff08;XGBoost/LightGBM/CatBoost/scikit-learn/pyspark 模型&#xff09;四、自然语言示例&#xff08;transformers&#xff09;五、使用 DeepExplainer 的深度学习示例&#xff08;TensorFlow/Keras 模型&#xff09;六、…

如何利用R包进行主成分分析和可视化

一. 使用R包“FactoMineR”进行主成分分析&#xff08;PCA&#xff09; 基本步骤如下&#xff1a; 安装和加载包&#xff1a;如果尚未安装&#xff0c;首先安装“FactoMineR”包&#xff0c;然后加载它&#xff1a; install.packages("FactoMineR")library(FactoM…

2024年5月面试知识点梳理

2024年5月面试知识点梳理 资料来源Java基础泛型基本概念常见问题 字符串注解异常反射SPI机制Java集合CollectionMap 并发基础基础理论线程Java 中的锁乐观锁与悲观锁自旋锁与非自旋锁公平锁与非公平锁 并发关键字 - synchronized并发集合Lock核心类并发集合核心类原子类核心类线…

ARM机密计算组件

安全之安全(security)博客目录导读 目录 ​一、硬件架构 1、RME 二、软件和固件架构 1、RMM 2、其他固件标准&#xff08;例如PSCI&#xff09; 三、开源实现 1、TF-A 2、Veraison 3、工具链 四、动态TrustZone技术 Arm机密计算架构(Arm CCA)引入了一系列硬件和软件…

vue网页端控制台展示独有标记

效果展示 实现步骤 1. 新建js文件 定义一个类 用于提供控制台打印日志显示样式的方法 src\libs\util.log.js class Logger {// 定义静态方法static typeColor(type "default") {let color "";switch (type) {case "default":color "#3…

AIGC行业现在适合进入吗

一、引言 随着人工智能技术的飞速发展&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;行业正逐渐成为科技领域的新热点。AIGC通过利用人工智能技术&#xff0c;自动生成文本、图像、音频、视频等多种形式的内容&#xff0c;极大地提高了内容生产的效率和质量。然而…

案例实践 | 基于长安链的华电集团碳资产精细化管理体系

案例名称-碳资产精细化管理体系 ■ 建设单位 北京华电电子商务科技有限公司 ■ 用户群体 华电集团内各级公司及相关产业链单位 ■ 应用成效 解决数据精准可信问题与隐私保护问题&#xff0c;提升碳资产管理效能&#xff0c;入选国资委的国有重点企业管理标杆项目 案例…

高通QCS6490开发(六):连接使用摄像头

本文将会介绍如何在FV01开发板上连接摄像头和显示预览。 所用硬件有&#xff1a; 1. FV01开发板 2.Raspberry 摄像头 操作步骤如下&#xff1a; 通过FPC线和杜邦线将FV01板和摄像头连接起来&#xff0c;接线如下&#xff1a; 1、Camera设备连接&#xff0c;通过22pin转15pi…

echarts树图 改文本显示的地方的样式

树图改文本显示的时候的样式 虽然有点越改越丑 其中有一些失败的尝试 forammter 无法识别html元素 所以对于tooptips有用的html元素定义获取返回在这里写的话是不生效的 rich配置项里面的backgroundColor官方说支持 html元素和canvas元素 已经图片url 没有详细试验 官网地址 h…

实验室无法培养的菌,原来可以这么研究!

厌氧氨氧化&#xff08;anammox&#xff09;细菌在全球氮循环和废水氮去除中发挥着至关重要的作用&#xff0c;由于anammox细菌生长缓慢、难以培养等特点&#xff0c;对其生态学和生物学特性知之甚少。近日&#xff0c;凌恩生物合作客户重庆大学陈猷鹏教授团队在《Science of t…

腾讯面向大众!普通人玩微信视频号,就能月入过万!

哈喽~我是电商月月 说起创业&#xff0c;电商这个赛道真的很适合普通人去闯&#xff0c;我为什么这样说&#xff0c;其实有两个原因 项目省钱&#xff1a;做电商不需要货物&#xff0c;没接触过电商的朋友应该不了解&#xff0c;每个电商平台都存在大批量的“无货源”商家 就…

【QT学习】15.数据库

一。安装数据库 1.判断数据库是否安装成功 方法一&#xff1a;命令行检测 1.进入命令行&#xff08;不需要管理员模式&#xff09; 2.结果说是欢迎进入mysql&#xff0c;表示mysql成功安装 方法二&#xff1a;navicat连接mysql 二。qt上配置MySQL 1.配置qt之前 1.点击mysql.p…

人工智能领域向量化技术加速多模态大模型训练与应用

目录 前言1、TextIn文档解析技术1.1、文档解析技术1.2、目前存在的问题1.2.1、不规则的文档信息示例 1.3、合合信息的文档解析1.3.1、合合信息的TextIn文档解析技术架构1.3.2、版面分析关键技术 Layout-engine1.3.3、文档树提取关键技术 Catalog-engine1.3.4、双栏1.3.5、非对称…

MHD、MQA、GQA注意力机制详解

MHD、MQA、GQA注意力机制详解 注意力机制详解及代码前言&#xff1a;MHAMQAGQA 注意力机制详解及代码 前言&#xff1a; 自回归解码器推理是 Transformer 模型的 一个严重瓶颈&#xff0c;因为在每个解码步骤中加 载解码器权重以及所有注意键和值会产生 内存带宽开销 下图为三…

安防视频汇聚/智能分析云平台EasyCVR调用localfile接口会返回日志的问题该如何解决?

视频汇聚/安防视频融合云平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备&#xff0c;平台能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理。视频监控/集中存储系统EasyCVR平台可支持国…

中青杯全国大学生数学建模竞赛纳入多所高校学科竞赛认定目录

2024年第六届中青杯全国大学生数学建模竞赛将于2024年5月23日17:00至5月26日17:00举行,中青杯全国大学生数学建模竞赛是中国高校学科竞赛中规模较大、影响较广的学科竞赛之一,并且纳入多所高校学科竞赛认定目录。 报名截止时间:2024年5月23日12:00 报名网站:http://www.c…

Hadoop 3.4.0 项目实战

1环境基于 上一篇搭建 高可用分布式集群 2 官方提供MapReduce程序 #评估圆周率 cd /data/hadoop/share/hadoop/mapreduce/ hadoop jar hadoop-mapreduce-examples-3.4.0.jar pi 2 6 3 实例项目分析1 #预分析的文件如&#xff0c;如单词统计 # #上传文件到hdfs hdfs …

淘系淘宝订单详情api接口(订单详情,订单列表,出售中,库存等属性)

淘系淘宝订单详情api接口&#xff08;订单详情&#xff0c;订单列表&#xff0c;出售中&#xff0c;库存等属性&#xff09;

【基础算法总结】二分查找二

二分查找二 1.山脉数组的峰顶索引2.寻找峰值3.寻找旋转排序数组中的最小值4.点名 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.山脉数组的…

【vue3】vue3中如何使用typescript

简言 现在vue3和typescript搭配使用是一个较常见的方案&#xff0c;下面参考vue3官网总结下在vue项目中使用ts(TypeScript)的方法。 typescript配置 新建项目 如果你准备新建vue3项目&#xff0c;那么使用create-vue官方脚手架&#xff0c;它提供了搭建基于 Vite 且 TypeSc…