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

news2024/9/27 15:35:00

目录-总 -分- 总结构

  • 图片可视化 总
  • 源码
  • 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总结

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

每一个节点就是砖头

进栈 就是把砖头放进去

出栈 就是把砖头拿出来

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

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

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

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

相关文章

行业报告 | 企业AIGC商业落地应用研究报告

原创 | 文 BFT机器人 01 AIGC&#xff08;生成式人工智能&#xff09;定义 02 洞观&#xff1a;AIGC市场全貌与供应商的摩拳擦掌 生成式人工智能技术的落地已经远远超出了商业化的进程 在企业现有数字化作业体系中切入&#xff0c;成为AIGC率先落地的存量场景 和SaaS同根的生成…

破坏双亲委派机制(自定义类加载器)

jvm中讲过&#xff0c;一个类的创建是要经历类加载器的&#xff0c;那么我们来讲讲如何自定义类加载器。 jvm优先级最高的就是自定义类加载器&#xff0c;为什么这么说呢&#xff1f;我们来看看类加载器的源码&#xff1a; 首先我们解释一下这个方法做了什么&#xff0c;要求返…

网络套接字编程

之前我们粗浅的认识了一下网络的一些知识&#xff0c;比如OSI七层模型&#xff0c;TCP/IP四层模型&#xff0c;那么我们具体怎么实现两台主机的交互呢&#xff1f; 在学习这些之前&#xff0c;我们需要准备一些预备知识。 目录 预备知识 1:认识源IP地址和目的IP地址 2&…

matlab字符串的操作方法

一个字符串是存储在一个行向量中的文本&#xff0c;这个行向量中的每一个元素代表一个字符&#xff0c;字符串可以由0个或多个字符组成。下面是一些字符串的操作方法 &#xff08;1&#xff09;字符串的创建 MATLAB中创建字符串非常简单&#xff0c;将字符串中的字符放到一对…

Jmeter接口之间的动态关联(同一线程组和跨线程组)

目录 前言&#xff1a; 动态关联提取cookie 1.同一线程组里的请求之间进行动态关联 2.跨线程组之间的动态关联 前言&#xff1a; 在进行接口测试时&#xff0c;有时候需要将一个接口的返回值作为参数传递给另一个接口&#xff0c;这就需要用到动态关联。JMeter提供了丰富的…

Haproxy负载均衡集群(时间能回答少年的所有不解)

文章目录 一、Haproxy的基础了解1.常用的负载均衡调度器2.Haproxy 应用相比较其他的优缺点3.Haproxy的特性4.LVS、Nginx、HAproxy的区别 二、Haproy负载均衡部署1.实验前准备2.实验的具体操作步骤步骤一&#xff1a;部署haproxy负载均衡调度器步骤二&#xff1a;Nginx节点服务器…

MySQL——深入理解

前言 MySQL——深入理解主要包括MySQL的存储引擎、索引以及索引对数据库操作的性能优化、SQL优化、视图、存储过程、存储函数、触发器、锁、innoDB引擎的结构原理和数据库的相关管理操作。在这篇文章中&#xff0c;荔枝也是且学且整理&#xff0c;希望能帮助到有需要的小伙伴吧…

Esxi6给虚拟机磁盘扩容

需求 因为最初磁盘规划没想好&#xff0c;导致磁盘给的太小&#xff0c;很快磁盘被用满了&#xff0c;所以需要把该磁盘扩容。 我们这里尝试将/home分区由原来的45GB增加50GB&#xff0c;所以首先我们需要将整个虚拟机扩容50GB&#xff0c;然后再把这50GB全部分给/home分区&a…

前端网址收藏

1.图标库 ByteDance IconPark

WebGL的一些Bug

一、TypeErrpr,Cannot set properties of undefined("setting 1") at _JS_WebRequest_Create(...) 类似这样的问题 解决方案1&#xff1a;可能是BestHTTP插件导致的&#xff0c;打开BestHttp插件目录&#xff0c;找到BestHTTP/Plugins/WebGL目录文件夹下的&#xff…

COMSOL晶体材料损伤断裂模拟基于Voronoi维诺图泰森多边形建模

在外部荷载及内力效应的作用下&#xff0c;晶体材料将发生断裂破坏&#xff0c;按晶体材料断裂时裂纹扩展路径的差异&#xff0c;可将晶体的断裂分为穿晶断裂及沿晶断裂两种断裂形式。 穿晶断裂中裂纹穿过晶体的晶粒内部&#xff0c;断裂面较为粗糙&#xff1b;沿晶断裂中裂纹…

python读取广州-湛江天气csv文件并做可视化仪表盘

1.读取广-湛.csv文件 import pandas as pd data pd.read_csv(广-湛天气.csv) data 2.去除多余字符 #去除多余字符 data[[最高温度,最低温度]] data[[最高温度,最低温度]].apply(lambda x: x.str.replace(,).replace(, 0)) data.head() 3.删除2023年数据,并计算平均温度保存到…

【文件 part 1 - 文件的概念】

一、文件的概念 文件用来存放程序、文档、音频、视频数据、图片等数据的。 文件就是存放在磁盘上的&#xff0c;一些数据的集合。 在windows下可以通过写字板或记事本打开文本文件对文件进行编辑保存。写字板和记事本是微软程序员写的程序&#xff0c;对文件进行打开、显示、读…

2023虎啸奖揭榜 | AI加码,数说故事再度荣膺两项大奖

近日&#xff0c;第十四届虎啸奖颁奖典礼圆满落幕&#xff01;本届获奖名单已正式公布。自2018年起&#xff0c;数说故事已连续6年获奖&#xff0c;今年再度斩获“年度AI&大数据服务公司”大奖&#xff0c;旗下数说雷达是本届虎啸奖唯一荣获“年度最佳营销效果监测评估系统…

新手如何组装一台电脑

新手如何组装一台电脑 首先&#xff0c;我们要先了解一台电脑的基本构成由哪些&#xff1f; CPU显卡主板散热器磁盘内存电源机箱显示器 通常我们需要根据自己对电脑的定位&#xff0c;根据需求和资金确定CPU和显卡 CPU CPU主要有AMD和Intel。 Intel芯片单核能力足够强&…

大数据模型交易行业类型及数据挖掘工具

大数据模型交易平台拥有大量大数据人工智能项目案例资源&#xff0c;涉及行业领域包括农业、电力、电信、地质、医疗、环保、政务等行业。各行业通过模型预测可以获知预测风险率&#xff0c;可以找到应对风险措施同时也可以及时解决相关问题。 政务大数据模型 教育大数…

AutoCV第十课:3D基础

3D基础 前言 手写 AI 推出的全新保姆级从零手写自动驾驶 CV 课程&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 本次课程我们来学习下 nuScenes 数据集的可视化。 课程大纲可看下面的思维导图。 1. nuScenes数据集 明确下我们本次学习的目的&#xff1a;将…

ThinkPHP3.2.3通过局域网手机访问项目

折腾一上午&#xff0c; 试了nginx&#xff0c; 试了修改Apache的httpd.conf 试了关闭代理 试了手动配置网络 试了关闭防火墙 试了添加防火墙入站出站规则 问了五个ChatGPT 都没解决。 记录一下 wampserver3.0.4 Apache2.4.18 PHP 5.6.19 MySQL 5.7.11 所有服务启…

交换机上云MACC方式

步骤1、尝试ping通114.114.114.114 步骤2、尝试ping cloud.ruije.com.cn 若不通&#xff0c;配置dns&#xff1a;ip name-server 223.5.5.5 步骤3、设备开启cwmp功能 Ruijie#conf t Ruijie(config)#cwmp Ruijie(config-cwmp)#acs url http://118.190.126.198/service/tr069s…

Jmeter对数据库批量增删改查

目录 前言&#xff1a; 一、主要配置元件介绍 二、共有元件数据配置如下 前言&#xff1a; JMeter可以通过JDBC请求实现对数据库的批量增删改查。JDBC请求模拟了一个JDBC请求&#xff0c;它是连接池中的一个虚拟用户。JDBC请求可以定义SQL语句和预编译参数&#xff0c;…