C语言---栈(详解)---数据结构

2023-10-27

如果要拿数据要先拿最上面的,不允许跳过第一个,拿第二个。

先重定义类型,意义前几篇都要讲,就不再赘述

实现栈要用到的头文件

结构体

top是记录栈中现有多少个数据,并且top一直处于栈顶

capacity就是容量大小,如果大于容量大小,那么我们就增容

栈实现的功能有:1.初始化栈 2,入栈,3.出栈 ,4.判断栈是否为空,5.返回栈顶元素,6.返回栈先有多少数据,7.释放栈

1.初始化栈

因为a是用来存放数据的,所以我们先给a创建一定的空间,(你创建的空间要和初始化cpacity的一样) 比如我给a创建了4的空间,那么我给capacity也初始化了4。

因为现在栈中斌没用数据,所以记录数据的top初始化为0

跟a中要相同,那么capacity容量初始化为4

2.入栈 

因为栈中a已经有元素了,不用像单链表那样,要先让a进去创建空间,所以这边我们要先判断记录栈的数据是否达到了容量大小

如果达到了,我们先用与a同类型的tmp创建空间 在原先的基础上*2的空间  

创建好后,我们再把tmp赋值给a

相应的capacity(容量大小)也要*2

然后我们直接对数据a中第top的位置存入数据(如果栈中没数据 top为0 那么就是数据a中第0个位置存入,如果有,那么就是数据a中第n个位置存入

 3.出栈

出栈的原理简单,我们直接对记录数据top--,(若数据中有6个元素,那么我们就--,就剩下5个元素,等相当于出栈了

这里要断言(assert)因为top不能为空,若为空,--会出内存错误

4.判断栈中是否为空

这里原理意思一样的,直接判断top是否为0,

用bool 就是top若为0则为假,若不为0,则为真

 5.返回栈顶元素

直接返回存放数据a中第top位置的数据,--是因为第一次入在0的位置,top为1,你要返回0的数据,得先--top

因为你要返回得数据是你重命名过的类型,那么你得函数返回类型也要是你重命名过的类型

 6.返回栈中有多少数据

 这里也是直接返回top的大小,top为几,就有几个元素

 7.如何打印栈

栈他不能遍历,所以我们要打印栈,(要先打印栈顶元素,然后再把栈顶元素出栈,再继续打印第二数据(这时候第二个数据就变成了栈顶元素

1.先判断栈是否为空

2.先打印栈顶元素

3.出栈

4.就此循环

8. 释放栈

我们直接释放a中的数据,再把指针a置为空。

最后把top(记录栈中的数据)和capacity(容量大小)都置为0

 

 栈的全部功能就完成了!

接下来是源码,需要自取

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

typedef int STDataType;

typedef struct Stack
{
	STDataType* a;//存放数据
	int top;//指向栈顶元素
	int capacity;//容量大小
}ST;

void StackInit(ST* ps)//初始化栈
{
	ps->a= (STDataType*)malloc(sizeof(STDataType) * 4);
	ps->top = 0;
	ps->capacity = 4;
}

void StackPush(ST* ps, STDataType data)//入栈
{
	assert(ps);

	if (ps->top == ps->capacity)
	{
		STDataType* tmp = (STDataType*)realloc(ps->a, ps->capacity *2* sizeof(STDataType));
		ps->a = tmp;
		ps->capacity *= 2;
	}
	ps->a[ps->top] = data;
	ps->top++;
}

void StackPop(ST* ps)//出栈
{
	assert(ps);
	assert(ps->top);

	ps->top--;
}

STDataType* StackTop(ST* ps)//返回栈顶元素
{
	assert(ps);

	return ps->a[ps->top-1];
}

bool StackEmpty(ST* ps)
{
	assert(ps);

	return ps->top == 0;
}

int StackSize(ST* ps)
{
	assert(ps);

	return ps->top;
}

void StackDestroy(ST* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}

void Intenode()
{
	ST st;
	//初始化栈
	//void StackInit(Stack* ps);  
	StackInit(&st);
	//入栈
	//void StackPush(Stack* ps, STDataType data);
	StackPush(&st, 1);
	StackPush(&st, 2);
	StackPush(&st, 3);
	StackPush(&st, 4);
	StackPush(&st, 5);
	StackPush(&st, 6);
	printf("当前栈中有%d\n", StackSize(&st));
	while (!StackEmpty(&st))//判断栈是否为空
	{
		printf("%d ", StackTop(&st));//打印栈顶元素,这里返回的是栈顶元素,我们把它打印出来
		StackPop(&st);//把栈顶元素出栈,接下来第二个元素就成为了栈顶元素,下次循环就打印这个栈顶元素
	}
	//出栈
//  void StackPop(Stack* ps); 
	
	//返回栈顶元素
	//StackTop(Stack* ps);  
	
	//查看栈中有多少元素
	//StackSize(Stack* ps);
	//判断栈是否为空
//  StackEmpty(Stack* ps); 
	
	//销毁栈
	//StackDestroy(Stack* ps);
	StackDestroy(&st);
}

int main()
{
	Intenode();

	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言---栈(详解)---数据结构 的相关文章

随机推荐

  • Gale-Shapley 算法 寻找稳定婚配java实现

    一 举例 1 男性 姓名 序号 Alex 0 Bob 1 Chris 2 David 3 2 女性 姓名 序号 Ada 0 Becky 1 Cindy 2 Diana 3 二 代码实现 男性类 rank属性说明 喜欢的女性编号从最喜欢依次排
  • 把TXT GB2312文件转换成TXT UTF8文件

  • (附源码)spring boot酒店管理平台 毕业设计201010

    springboot酒店管理平台 摘 要 信息化社会内需要与之针对性的信息获取途径 但是途径的扩展基本上为人们所努力的方向 由于站在的角度存在偏差 人们经常能够获得不同类型信息 这也是技术最为难以攻克的课题 针对酒店管理平台等问题 对酒店管
  • 生成指定数量的随机数 - R语言

    生成指定数量的随机数 R语言 在R语言中 我们可以使用各种函数来生成指定数量的随机数 本文将介绍几种常用的方法 并提供相应的源代码示例 使用sample 函数生成随机数 sample 函数可以从给定的元素中随机抽取指定数量的样本 我们可以利
  • Redhat7.6安装MySQL8.0.23——二进制安装

    操作系统版本 Red Hat Enterprise Linux 7 6 MySQL版本 mysql 8 0 23 el7 x86 64 tar gz groupadd mysql useradd g mysql mysql echo mys
  • k8s学习-CKS真题-日志审计 log audit

    目录 题目 环境搭建 解题 模拟题 参考 题目 Task 在 cluster 中启用审计日志 为此 请启用日志后端 并确保 日志存储在 var log kubernetes audit logs txt 日志文件能保留 10 天 最多保留
  • 个别网站访问不了的解决方法

    当电脑只有个别网站无法打开时 极有可能是因为该网站的网址无法被当前的dns解析而造成的 解决方法 1 在可以访问的电脑上ping 网址 得到该网址对应的ip A 2 在访问不了该网址的电脑上ping 上个步骤获得ip 看是否能ping通 如
  • 解决nginx搭建图片服务器访问图片404

    本人主要解决搭建nginx搭建图片服务器 然后访问图片404的问题 原文链接 cd usr local nginx vim nginx conf nginx conf 博主的错误是local刚开始写的是 location images ro
  • 添加数值标签——Python实现

    添加数值标签 Python实现 在数据可视化的过程中 通常需要将图表中的数据点标记上相应的数值 来方便观察者对数据的理解 而在Python中 我们可以使用matplotlib库来进行绘图 并通过其提供的函数来添加数值标签 下面将以折线图为例
  • 【满分】【华为OD机试真题2023 JS】数组的中心位置

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 数组的中心位置 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给你一个整数数组nums 请计算数组的中心位置 数组中心位置是数组的一个下标 其左侧所有元素相乘的
  • Java入门-学习黑马程序员Java基础视频教程(到P92)

    目录 P0 写在前面的小知识 P3 Java环境搭建 JDK安装 常用命令 P4 入门程序HelloWorld P7 补充知识 JDK组成 跨平台原理 P8 补充知识 JDK安装后Path和JAVA HOME环境变量 P9 IDEA开发工具
  • OpenFace库(Tadas Baltrusaitis)中基于Haar Cascade Classifiers进行人脸检測的測试代码

    Tadas Baltrusaitis的OpenFace是一个开源的面部行为分析工具 它的源代码能够从 https github com TadasBaltrusaitis OpenFace 下载 OpenFace主要包含面部关键点检測 fa
  • React 实现井字棋游戏 (tic-tac-toe) 教程 (6) <译自官方文档>

    React 实现井字棋游戏 tic tac toe 教程 1 lt 译自官方文档 gt React 实现井字棋游戏 tic tac toe 教程 2 lt 译自官方文档 gt React 实现井字棋游戏 tic tac toe 教程 3 l
  • Jama实现奇异值分解需要注意的问题(SVD)

    可以直接使用Jama的svd 例如 SingularValueDecomposition s paraMatrix svd 但是一定要注意前提是该矩阵的行比列大才行 否则会报错
  • 深入理解Vue双向数据绑定

    MVVM Vue的双向数据绑定是指model 模型 也就是vue实例中的数据 和view 视图 的双向绑定 即一个发生改变 另一个也会改变 首先了解一下什么是MVVM model view viewmodel 在 MVVM 架构中 引入了
  • selenium webdriver webelement获取标签方法

    1 等待浏览器加载完指定的标签 from selenium webdriver support wait import WebDriverWait from selenium webdriver support import expecte
  • 使用C++中用OLEDB读dbf文件,报“外部表不是预期的格式”错误的处理

    使用C builder的ADO控件访问dbf文件 执行SQL时报错 我的connect连接字符串 con1 gt ConnectionString Provider Microsoft Jet OLEDB 4 0 Data Source s
  • python 基于GPS空间相似度的K-means轨迹聚类

    python 基于空间相似度的K means轨迹聚类 数据读取 定义不同轨迹间的距离 计算距离矩阵 k means聚类 这里分享一些轨迹聚类的基本方法 涉及轨迹距离的定义 kmeans聚类应用 需要使用的python库如下 import p
  • Node事件循环

    node事件循环和浏览器事件循环完全不一样 Node事件循环阶段 timers 定时器 此阶段执行setTimeout和setInterval调度的回调函数 I O callback I O回调 此阶段执行几乎所有的回调函数 除了close
  • C语言---栈(详解)---数据结构

    如果要拿数据要先拿最上面的 不允许跳过第一个 拿第二个 先重定义类型 意义前几篇都要讲 就不再赘述 实现栈要用到的头文件 结构体 top是记录栈中现有多少个数据 并且top一直处于栈顶 capacity就是容量大小 如果大于容量大小 那么我