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

news/2024/11/2 3:34:18/

目录-总 -分- 总结构

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

图片可视化 总

在这里插入图片描述

源码

/*time 2023年6月12日12:39:06auther yzmcntent 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;//释放 tfree(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;//释放 tfree(t);return;}

10总结

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

每一个节点就是砖头

进栈 就是把砖头放进去

出栈 就是把砖头拿出来

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

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


http://www.ppmy.cn/news/345232.html

相关文章

使用randoop自动化生成测试用例

1. 综述 使用randoop自动化生成测试用例 2. 操作 下载randoop的jar包&#xff1b;将jar包和所要测试的类&#xff08;如Calculate.class&#xff09;放在同一个文件夹&#xff1b;在此文件夹打开命令行提示符&#xff0c;输入如下命令&#xff1a; java -ea -classpath .;ra…

Unity入门2——Unity工作原理

一、工具栏 文件操作&#xff1a;新建工程&#xff0c;新建场景&#xff0c;工程打包等等 编辑操作&#xff1a;对象编辑操作相关&#xff0c;工程设置&#xff0c;引擎设置相关 资源操作&#xff1a;基本等同于 Project 窗口中右键相关功能 对象操作&#xff1a;基本等同于 Hi…

QT6.3.2添加背景音乐

本人萌新&#xff0c;在学习的时候&#xff0c;发现老师写的程序能运行并播放音乐.wav格式。但是同样代码的我一直报错。我经过查找发现qt由于版本更新&#xff1a; 到了Qt6删除了Qsound类。经过摸索发现&#xff0c;QSoundEffect这个类能达到同样效果。 使用时要在.pro文件添…

乐鑫ESP32-C3模组选型

一、安信可不再使用乐鑫芯片&#xff0c;迫不得已选择乐鑫原厂 二、乐鑫模组选择 ESP32&#xff0d;C3&#xff0d;MINI&#xff0d;1ESP32&#xff0d;C3&#xff0d;WROOM&#xff0d;02 根据管脚布局&#xff0c;我更喜欢ESP32-C3-WROOM-02这一款&#xff0c;而且可用引脚一…

Cubase10.5稳定版安装包+安装教程

简介 CuBase Pro 10中文版是一款为专业人士提供的制作高品质音乐的专业高效的音乐制作软件&#xff0c;在每个领域都有独树一帜的领头羊&#xff0c;那么CuBase Pro 10中文版就是音乐制作业内公认的Top1&#xff0c;流线型的音乐制作环境&#xff0c;能帮助您抓住音乐创造力的时…

51单片机的音乐盒设计

一.硬件设计 本设计的硬件主要由51单片机最小系统&#xff08;AT89C51/52、AT89S51/52、STC89C51/52均通用&#xff09;、LED指示灯、LM386功率放大电路、喇叭、按键电路等构成。 二.设计功能 本设计内置8首歌曲&#xff0c;按键可以上一曲&#xff0c;下一曲&#xff0c;开始…

【2020.2.29更新】高通蓝牙芯片QCC3003,QCC3008 学习视频教材

一直工作在蓝牙应用的软件开发。 在工作之余&#xff0c;利用手中的开发板做了一些视频&#xff0c; 方便准备学习的开发人员快速入门&#xff0c;更容易上手。 此视频 适用于 所用QCC3000系列&#xff1a;3001,3002, 3003,3004,3005,3006,3007,3008 &#xff1d;&#xff1d…

乐鑫ESP32-S3双核处理器,专为 AIoT 市场打造

乐鑫ESP32-S3双核处理器&#xff0c;专为 AIoT 市场打造 ESP32-S3 是一款集成 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE) 的 MCU 芯片&#xff0c;支持远距离模式 (Long Range)。ESP32-S3 搭载 Xtensa 32 位 LX7 双核处理器&#xff0c;主频高达 240 MHz&#xff0c;内置 512 KB SR…