【数据结构】超详细——动态栈

2023-10-28

1、栈的概念和结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶

出栈:栈的删除操作叫做出栈,出数据也在栈顶

image-20221119154919115

image-20221119160926772

2、栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

image-20221119163544840

image-20221119164648322

下面代码是定长的静态栈的结构,但在实际应用中较少使用。

typedef int STDataType;
#define N 10
typedef struct Stack
{
    STDataType a[N];
    int top;//栈顶
}Stack;

动态栈的结构在日常开发中使用较多,本节将对动态栈进行详细说明:

typedef int STDataType;
typedef struct Stack
{
    STDataType* a;
    int top;
    int capacity;
}ST;

初始化时,栈中属性a在堆中开辟一块4*sizeof(STDataType)的空间,同时给top赋值0,capacity赋值4。

void StackInit(ST* ps)
{
	assert(ps);
	ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);
	if (ps->a == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	ps->top = 0;
	ps->capacity = 4;

入栈,首先判断a是否存满,符合条件ps->top == ps->capacity时,表明a已经存满,此时重新在堆中开辟一块空间以替代旧的a的空间;若a有空,则直接将要插入的值x直接压栈进入pa->a[pa->top]

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

	if (ps->top == ps->capacity)
	{
		STDataType* tmp = realloc(ps->a, ps->capacity * 2 * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity *= 2;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

出栈比较容易,出栈一次,就top-1

void StackPop(ST* ps)
{
	assert(ps);
	assert(ps->a > 0);

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

获取栈顶元素

STDataType StackTop(ST* ps)
{
    assert(ps);
    assert(ps->a > 0);

    ps->top--;
}

获取栈中有效元素个数

int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

检测栈是否为空,如果为空返回非0结果,如果不为空返回0

int StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

销毁栈,详见说明请参考动态内存管理

void StackDestroy(ST* ps)
{
	assert(ps);

	free(ps->a);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}

3、调试

void TestStack1()
{
	ST st;
	StackInit(&st);
	StackPush(&st, 1);
	StackPush(&st, 2);
	StackPush(&st, 3);
	StackPush(&st, 4);
	StackPush(&st, 5);

	printf("size:%d\n", StackSize(&st));
	printf("size:%d\n", st.top);

	StackPop(&st);
	StackPop(&st);
	StackPop(&st);

	printf("%d\n", StackTop(&st));

	StackDestroy(&st);

}

image-20221119221048184

初始化栈后的栈结构属性值:

image-20221119222030632

5次压栈后,栈内结构属性值:

image-20221119221831676

此时,top的值为5。最后,销毁栈时,释放堆中的空间,将存储在a的空间首元素地址NULL。

image-20221119222704316

详细的代码详见:动态栈

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

【数据结构】超详细——动态栈 的相关文章

随机推荐

  • Mac操作系统下 命令行 cp命令的坑

    Mac系统下的命令与Linux系统下的命令大部分是一样的 但是有一些事不同的用法 有的时候找个命令在Linux下好使 在Mac下就不好使 下面来研究下cp命令在Mac系统下的坑 Mac MacBook Pro mac mkdir aa Ma
  • Your build is currently configured to use Java 17.0.6 and Gradle 5.6.4.

    报错信息 Unsupported Java Your build is currently configured to use Java 17 0 6 and Gradle 5 6 4 Possible solution Upgrade G
  • C++ abort() has been called错误

    程序可以成功编译 说明没有语法问题 应是代码内部的问题 报错如下 abort has been called 中止被调用 该错误出现有很多原因 查询了多条博客后 发现一卒2018博主已经在博客上总结了几条原因和解决办法 谢谢博主 借博主的思
  • JAVA容器学习-集合

    Java集合是我认为在Java基础中最最重要的知识点了 Java集合是必须掌握的 我在实习 秋招面试的时候 只要是面到Java 那一定是少不了Java集合 作为一个新人 最关心的其实有一点 这个技术在工作中是怎么用的 换个说法 工作中常用到
  • 如何在BIOS中开启虚拟化技术

    虚拟化技术目前主要依赖于您电脑的CPU型号及BIOS 某些CPU或者BIOS暂时还不能支持虚拟化技术 支持虚拟化技术的可以在BIOS中开启 开启方法如下 1 进入BIOS 开机时按F2或F12或DEL或ESC等键 各电脑有所不同 2 进入B
  • jmeter安装和压力测试

    一 安装 1 1 下载安装包 1 2 解压到指定目录 1 3 配置环境变量 JMETER HOME D java apache jmeter 5 1 1 CLASSPATH JMETER HOME lib ext ApacheJMeter
  • React利用路由实现登录界面的跳转

    React利用路由实现登录界面的跳转 上一篇在配置好了webpack和react的环境后 接下来开始写登录界面 以及接下来的跳转到主页的功能 1 首先看一下总体的目录结构 因为很多时候在看别人写的例子的时候因为目录结构不熟悉后边会出现意想不
  • Android RecyclerView BaseSectionQuickAdapter实现分组功能

    详情网站 手把手教你使用BaseSectionQuickAdapter实现分组功能 史上最详细Adapter使用教程 basequickadapter 分组 杨阿程的博客 CSDN博客 加入二个包 implementation com an
  • Python 文件读取操作

    视频版教程 Python3零基础7天入门实战视频教程 文件IO操作 Python的内置库提供了对文件的IO操作 可以对文件进行打开 读 写 关闭等操作 文件读取操作 你必须先用Python内置的open 函数打开一个文件 创建一个file对
  • 软件工程 数据流图(DFD)变换型与事务型的分析

    在系统分析阶段 我们采用结构化分析方法得到了由数据流图 数据字典和加工说明等组成的系统的逻辑模型 现在 可根据一些规则从数据流图导出系统初始的模块结构图 管理信息系统的数据流图通常也可分为两种典型的结构 即变换型结构和事务型结构 变换型结构
  • 10-Java框架-SpringBoot整合MyBatis-Plus

    一 MyBatis Plus介绍 官网 https baomidou com MyBatis Plus 简称 MP 是一个 MyBatis的增强工具 在 MyBatis 的基础上只做增强不做改变 无侵入式 为简化开发 提高效率而生 MyBa
  • H5 打开微信小程序 公众号

    1 打开公众号的方式 https mp weixin qq com mp profile ext action home biz 公众号BASE64ID scene 110 wechat redirect base64ID 寻找方式 转发任
  • 基于 SpringBoot+Vue+Java 的高校招生管理系统(数据库+源码和教程)

    文章目录 简介 系统设计思路 1 数据库设计 2 系统整体设计 2 1 系统设计思想 2 2系统流程图 系统详细设计 1系统功能模块 2 管理员功能模块 3学生功能模块 简介 本次设计任务是要设计一个高校招生管理系统 通过这个系统能够满足管
  • [python应用案例] 一.BeautifulSoup爬取天气信息并发送至QQ邮箱

    前面作者写了很多Python系列文章 包括 Python基础知识系列 Python基础知识学习与提升 Python网络爬虫系列 Python爬虫之Selenium Phantomjs CasperJS Python数据分析系列 知识图谱 w
  • 【sqli-labs】 less29 GET- Error based -Impidence mismatch -Having a WAF in front of web application (G...

    这关有点意思 有一点需要事先注意 这关玩的是login php而不是默认的index php 再注入之前需要先了解一下HPP HTTP Parameter Pollution 详情参照这篇 http blog csdn net eatmil
  • caffe:利用python分类,并可视化模型参数、数据

    caffe官方文档 http nbviewer jupyter org github BVLC caffe blob master examples 00 classification ipynb 1准备工作 1 1 安装python nu
  • 通过ffmpeg进行录屏直播

    1 在Windows上安装FFmpeg程序 转载 参考地址 https www cnblogs com daxiong2014 p 4399046 html 2 通过ffmpeg进行录屏直播 参考地址 https blog csdn net
  • shopify cli 的命令

    shopify theme 多语言国际化开发 shopify theme 跨境电商开发 liquid 本地编辑shopify主题的方式一 shopify cli 的命令 使用shopify help
  • [转]聚簇索引与非聚簇索引(也叫二级索引)

    通俗点讲 聚簇索引 将数据存储与索引放到了一块 找到索引也就找到了数据 非聚簇索引 将数据存储于索引分开结构 索引结构的叶子节点指向了数据的对应行 myisam通过key buffer把索引先缓存到内存中 当需要访问数据时 通过索引访问数据
  • 【数据结构】超详细——动态栈

    1 栈的概念和结构 栈 一种特殊的线性表 其只允许在固定的一端进行插入和删除元素操作 进行数据插入和删除操作的一端称为栈顶 另一端称为栈底 栈中的数据元素遵守后进先出 Last In First Out 的原则 压栈 栈的插入操作叫做进栈