图解数据结构--栈的实现-C语言版本--源码

目录-总 -分- 总结构

  • 图片可视化 总
  • 源码
  • 1.头文件介绍---分
  • 2.节点的实现
  • 3.栈顶栈底
  • 4.函数的提前声明
  • 5. 栈 ---初始化栈
  • 6. 栈 ---进栈
  • 7.栈 --- 遍历
  • 8.栈 --- 是否为空
  • 9.栈 --- 出栈
  • 10总结

图片可视化 总

在这里插入图片描述

源码

/*
	time 2023年6月12日12:39:06
	auther yzm
	cntent stract  栈
*/


#include<stdio.h>//头文件
#include<malloc.h>//分配地址空间
#include<stdlib.h>//实现exit 终止程序

//定义节点
typedef struct node {
	int Data;
	struct node* pNext;

}NODE, * PNODE;


//栈
typedef struct stract {
	PNODE stractTop;//指向栈顶
	PNODE stractBottom;//指向栈底部
} STRACT, * PSTRACT;

//函数声明
PSTRACT init(PSTRACT pS);
void push(PSTRACT pS, int value);
void transverse(PSTRACT pS);
void pop(PSTRACT pS);
bool empty(PSTRACT pS);


int main() {
	//创建栈顶 栈底
	STRACT  S;

	//1.初始化栈
	PSTRACT pS =init(&S);

	//进栈
	push(pS, 1);
	push(pS, 2);
	push(pS, 3);
	push(pS, 4);
	push(pS, 5);
	push(pS, 6);
	push(pS, 7);
	//遍历输出
	transverse(pS);
	printf("出栈第1次");
	pop(pS);
	transverse(pS);

	printf("进栈第1次");
	push(pS, 74);
	transverse(pS);

	printf("出栈第2次");
	pop(pS);
	transverse(pS);

	printf("出栈第3次");
	pop(pS);
	transverse(pS);

	printf("进栈第2次");
	push(pS, 45);
	transverse(pS);

	printf("进栈第3次");
	push(pS, 54);
	transverse(pS);

	return 0;
}
//初始化栈
PSTRACT init(PSTRACT pS) {
	
	//申请地址
	PNODE phead = (PNODE)malloc(sizeof(NODE));
	phead->pNext = NULL;
	if (phead == NULL)
	{
		printf("地址分配失败");
		exit(-1);
	}
	pS->stractTop = phead;
	pS->stractBottom = phead;

	return pS;
}
//进栈
void push(PSTRACT pS,int value) {

	//创建节点
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if (pNew == NULL)
	{
		printf("地址分配失败");
		exit(-1);
	}

	//pnew 赋值
	pNew->Data = value;
	//pnew 指向
	pNew->pNext = pS->stractTop;
	//修改pS->stractTop;  栈顶指针
	pS->stractTop = pNew;

}
//遍历
void transverse(PSTRACT pS) {
	//创建 移动遍历的指针  指向栈顶
	PNODE p = pS->stractTop;

	while (p->pNext != NULL)
	{
		printf("%d ", p->Data);
		p = p->pNext;
	}
	printf("\n");

	return;
}

//是否为空
bool empty(PSTRACT pS) {
	if (pS->stractBottom == pS->stractTop)
	{
		return true;
	}
	else {
		return false;
	}
}


//出栈
void pop(PSTRACT pS) {
	//出栈
	//判空操作 
	if (empty(pS))
	{
		printf("空栈 无法出栈");
		return;
	}

	//1.t存放栈顶节点
	PNODE t = pS->stractTop;

	//2.修改栈顶的指针
	pS->stractTop = t->pNext;

	//释放 t
	free(t);


	return;

}


1.头文件介绍—分

#include<stdio.h>//头文件
#include<malloc.h>//分配地址空间
#include<stdlib.h>//实现exit 终止程序

2.节点的实现

//定义节点
typedef struct node {
	int Data;
	struct node* pNext;

}NODE, * PNODE;

以上就是 完成 这样的结构
在这里插入图片描述

3.栈顶栈底

typedef struct stract {
	PNODE stractTop;//指向栈顶
	PNODE stractBottom;//指向栈底部
} STRACT, * PSTRACT;

在这里插入图片描述

4.函数的提前声明

PSTRACT init(PSTRACT pS);
void push(PSTRACT pS, int value);
void transverse(PSTRACT pS);
void pop(PSTRACT pS);
bool empty(PSTRACT pS);

把要实现的函数 提前

5. 栈 —初始化栈

在这里插入图片描述

//初始化栈
PSTRACT init(PSTRACT pS) {
	
	//申请地址
	PNODE phead = (PNODE)malloc(sizeof(NODE));
	phead->pNext = NULL;
	if (phead == NULL)
	{
		printf("地址分配失败");
		exit(-1);
	}
	pS->stractTop = phead;
	pS->stractBottom = phead;

	return pS;
}

6. 栈 —进栈

在这里插入图片描述

//进栈
void push(PSTRACT pS,int value) {

	//创建节点
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if (pNew == NULL)
	{
		printf("地址分配失败");
		exit(-1);
	}

	//pnew 赋值
	pNew->Data = value;
	//pnew 指向
	pNew->pNext = pS->stractTop;
	//修改pS->stractTop;  栈顶指针
	pS->stractTop = pNew;

}

7.栈 — 遍历

在这里插入图片描述

//遍历
void transverse(PSTRACT pS) {
	//创建 移动遍历的指针  指向栈顶
	PNODE p = pS->stractTop;

	while (p->pNext != NULL)
	{
		printf("%d ", p->Data);
		p = p->pNext;
	}
	printf("\n");

	return;
}

8.栈 — 是否为空

在这里插入图片描述

//是否为空
bool empty(PSTRACT pS) {
	if (pS->stractBottom == pS->stractTop)
	{
		return true;
	}
	else {
		return false;
	}
}

9.栈 — 出栈

在这里插入图片描述

//出栈
void pop(PSTRACT pS) {
	//出栈
	//判空操作 
	if (empty(pS))
	{
		printf("空栈 无法出栈");
		return;
	}

	//1.t存放栈顶节点
	PNODE t = pS->stractTop;

	//2.修改栈顶的指针
	pS->stractTop = t->pNext;

	//释放 t
	free(t);


	return;

}

10总结

数据结构–栈
就像是一个木桶

每一个节点就是砖头

进栈 就是把砖头放进去

出栈 就是把砖头拿出来

那也就一意味着
最先放进去的砖头 被压着 只能把上面的拿出来 才能那下面的

这也就是 先进后出 后进先出的概念

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

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

相关文章

SpringBoot整合ShardingSphere5.x实现数据加解密功能

环境&#xff1a;Springboot2.6.14 ShardingSphere5.3.0 准备环境 添加依赖 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>${shardingsphere.version}</ve…

适合做读书笔记的工具 这款APP满足你的笔记需求

说到读书&#xff0c;就免不了要提到读书笔记。很多人认为&#xff0c;边读书边做笔记才能更好地帮助我们更深入地理解和记忆所读的书籍内容。通过记录书中的重要观点、论据、事实和例子&#xff0c;我们可以更好地掌握书中的知识和思想&#xff0c;而不是仅仅浏览、快速阅读或…

vscode右键点击,松开后自动触发鼠标所在位置的按钮(误触发双击效果)

例如如下&#xff0c;右键展开菜单&#xff0c;松手会自动触发转到声明功能 解决方案&#xff1a; 1、安装easystroke sudo apt-get install easystroke 2、打开easystroke&#xff0c;选择preferences tab 3、点击Gesture Button&#xff0c;在出现的框中右键单击一次 4、点…

Mocha Pro:AdjustTrack 模块

跟踪时由于缺乏细节或有障碍物阻挡&#xff0c;跟踪点发生了漂移&#xff0c;或者一个或多个跟踪点可能会离开画面&#xff0c;此时可考虑使用 AdjustTrack &#xff08;调整跟踪&#xff09;模块手动设置关键帧来获得更精准的跟踪数据。 尤其是当要利用表面 Surface区域进行插…

MarkDown使用教程

MarkDown使用教程 1.标题 #: 一级标题 ##: 二级标题 ###: 三级标题 一共分为六级 2.字体 斜体文本 斜体文本 粗体文本 粗体文本 粗斜体文本 粗斜体文本 3.列表 无序号的使用*、、- 作为列表的标记&#xff0c;这些标记后面添加一个空格 第一项第二项第三项 第一项第二项…

【C++11】移动赋值 | 新的类功能 | 可变参数模板

文章目录 1. 移动赋值2. 新的类的功能移动构造移动赋值defaultdelete 3.可变参数模板可变参数包的解析 文章目录 1. 移动赋值2. 新的类的功能移动构造移动赋值defaultdelete 3.可变参数模板可变参数包的解析 1. 移动赋值 C11中&#xff0c;string中的operator 包含 参数为右值的…

AI产业应用再提速,AI基础软件发挥巨擎作用

5月31日&#xff0c;由中国信息通信研究院、中国人工智能产业发展联盟主办&#xff0c;北京九章云极科技有限公司联合主办的【创造智能探索未知】杭州通用人工智能论坛-AI基础软件前沿技术分论坛在杭州成功举办。大会聚焦AI基础软件前沿技术&#xff0c;挖掘人工智能基础软件大…

IP地址定位原理

IP地址定位是一种通过IP地址来确定位置的技术&#xff0c;在互联网和移动网络的应用十分广泛。本文将介绍IP地址定位的原理和实现方式。 IP地址定位原理 IP地址是Internet Protocol&#xff08;简称IP&#xff09;的缩写&#xff0c;是互联网上的一个地址标识符用于识别连接到…

头文件header file和源文件 source file

头文件 header file&#xff0c;后缀是.h&#xff0c;头文件负责类的定义&#xff0c;函数声明&#xff0c;常量的定义 源文件source file&#xff0c;后缀是.cpp&#xff0c; 函数的实现 最主要的作用就是将函数的声明和实现分开&#xff0c;如果想将类和函数交给别人使用&a…

总结894

学习目标&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲遍&#xff0c;背诵15篇短文&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化3讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日必复习&#xff08;5分钟&#xff0…

天然气网络潮流计算模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

网络安全零基础之从原理看懂的XSS

01、XSS 的原理和分类 跨站脚本攻击 XSS(Cross Site Scripting)&#xff0c;为了不和层叠样式表(Cascading Style Sheets&#xff0c;CSS)的缩写混淆 故将跨站脚本攻击缩写为 XSS&#xff0c;恶意攻击者往 Web 页面里插入恶意 Script 代码&#xff0c;当用户浏览该页面时&…

软件开发模型

一、 概述   软件开发模型(Software Development Model)是指软件开发全部过程、活动和任务的结构框架。软件开发包括需求、设计、编码、测试和维护 阶段。   软件开发模型能清晰、直观地表达软件开发全过程&#xff0c;明确规定了要完成的主要活动和任务&#xff0c;用来作…

【状态估计】基于线性卡尔曼滤波器和粒子滤波器无人机估计地形高度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【数据可视化】Plotly Express绘图库使用

Plotly Express是一个基于Plotly库的高级Python可视化库。它旨在使绘图变得简单且直观&#xff0c;无需繁琐的设置和配置。通过使用Plotly Express&#xff0c;您可以使用少量的代码创建具有丰富交互性和专业外观的各种图表。以下是Plotly Express的一些主要特点和优势&#xf…

2020310

Selenium: 基于WebDriver协议的 Web应用程序测试的工具 精简版&#xff1a; selenium脚本通过http请求发送命令和参数给httpserver httpserver通过json wire protocol格式转发命令和参数给webdriver webdriver通过原生API或者JavaScript代码执行操作给浏览器 浏览器通过json wi…

什么是AI业务流程质检,如何用它做好销售和服务过程监督

近几年&#xff0c;随着语音转写、语义理解和机器学习等技术的成熟&#xff0c;越来越多的企业开始部署基于AI技术的智能质检系统&#xff0c;来帮助坐席、销售和服务团队提高沟通质量管理能力&#xff0c;同时提升沟通中的客户体验。 不过&#xff0c;不论是最初的人工质检&a…

object类型(equals、hashCode、getClass、getName)

equals方法的改写 Override//重写equals方法&#xff0c;重写方法后对比的属性值&#xff08;没有重写前对比的是属性值&#xff09;public boolean equals(Object obj) {Students s (Students) obj;return this.name.equals(s.name) && this.age s.age;}public clas…

2000-2019年280多个地级市就业人数数据(全市)/城市就业数据

2000-2019年280多个地级市就业人数数据&#xff08;全市&#xff09; 1、时间范围&#xff1a;2000-2019年 2、范围&#xff1a;包括280多个地级市 3、来源&#xff1a;城市NJ 4、统计口径&#xff1a;全市 5、单位&#xff1a;万人 6、缺失情况&#xff1a;与城市年鉴缺失情况…

Mysql中联合索引的最左匹配

联合索引 通过将多个字段组合成一个索引&#xff0c;该索引就被称为联合索引。 比如&#xff0c;将商品表中的 product_no 和 name 字段组合成联合索引(product_no, name)&#xff0c;创建联合索引的方式如下&#xff1a; CREATE INDEX index_product_no_name ON product(pr…