【数据结构】数据结构中的栈

news2024/11/25 7:13:13

文章目录

  • 前言
    • 什么是栈
    • 栈的实现
      • 栈的初始化
      • 入栈
      • 出栈
      • 栈的判空
      • 栈内有效数据个数
      • 返回栈顶数据
      • 栈的销毁

前言

该篇文章来了解数据结构中的,栈与队列都为一种线性存储结构,同时栈与队列在逻辑结构上,都只能在头或者尾进行对数据的操作;


什么是栈

栈是一种LIFO(Last in,First
out)的结构
,翻译过来即是后进先出的一种结构;栈无论是出数据还是入数据都只能从栈顶位置按顺序进行操作;

在这里插入图片描述

假设若是需要在一个栈中按顺序一次性存放1,2,3,4,5五个数据,则因为LIFO的规律,出栈时的顺序即为5,4,3,2,1;栈也可以在数据入栈时进行出栈,即若是只是入栈这5个数的话出栈的顺序不一定是5,4,3,2,1;

在这里插入图片描述

A. 可以在入栈时同时做到出栈,A入A出,B入B出…E入E出,A正确。
B.将数据按顺序一次性入栈再逐个出栈则为EDCBA,B正确。
C.入栈ABCD,此时栈内为ABCD,按顺序出栈D与C,此时栈内为AB,入栈E,此时栈内为ABE,出栈E后依次出栈B与C,C正确。
D.入栈ABCDE,此时栈内为ABCDE,出栈E,此时栈内为ABCD,C不为下一个出栈顺序,故D错误。


栈的实现

栈的实现可以用链表与数组若是用单链表进行实现的话,入栈的时间复杂度为O(1),但是若只是单单用单链表进行栈的实现的话,在出栈时,只能依靠遍历链表并释放尾节点时间复杂度为O(N)
若是用数组来实现的话,入栈的时间复杂度只需要O(1)出栈的时间复杂度也只需要O(1)
所以本次栈的实现使用顺序表进行实现


栈的初始化

栈的初始化与顺序表的初始化相同,创建一个动态数组存储数据,创建一个变量top记录栈顶的位置。创建一个变量capacity记录栈是否放满,若是放满则需要扩容。

typedef int STDataType;//重命名需要存放的数据类型便于更改

typedef struct Struct 
{
	STDataType* a;//动态数组
	int top;//栈顶数据
	int capacity;//容量
}STNode;

void STInit(STNode* ps)//初始化
{
	STDataType* tmp = (STDataType*)malloc(4 * sizeof(STDataType));
	if (tmp == NULL) {
		perror("malloc");
		exit(-1);
	}
	ps->a = tmp;
	ps->capacity = 4;
	ps->top = 0;
}

栈的初始化在初始化数组时可不开数据空间也可先开一块空间当不够存放再进行扩容
栈在初始化时可以定义栈顶的位置,栈顶位置是指向栈顶数据之后还是在栈顶位置,若是初始化栈顶为-1时,则栈指向的位置即为栈顶数据(-1位置不存放数据,存放数据时先++后赋值)
该处初始化初始化为0,即栈顶指向栈顶数据后。


入栈

入栈时则需要对栈的空间进行判断,若数组为满则需要对数组进行扩容。否则只需要入数据并++top。

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

该处不需要将扩容封装为一个函数(此处扩容只在入栈时用到)。


出栈

栈的出栈只需要将top进行-1,原数据并不需要抹去;但需要注意的时应该对top进行断言,若是栈已经为空则不能再进行出栈;

void STPop(STNode* ps)
{
	assert(ps);
	assert(ps->top);
	ps->top--;
}


栈的判空

栈的判空只需要判断top是否为空并返回布尔值即可;
栈为空返回true,否则返回false;

bool STEmpty(STNode* ps)
{
	assert(ps);
	return ps->top == 0;
}

栈内有效数据个数

栈内有效数据个数即为top所在的位置(栈顶数据下标位置+1);

STDataType STTop(STNode* ps)
{
	assert(ps);
	return ps->a[ps->top - 1];
}

返回栈顶数据

STDataType STTop(STNode* ps)
{
	assert(ps);
	return ps->a[ps->top - 1];
}

栈的销毁

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

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

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

相关文章

25 KVM管理虚拟机-虚拟机安全启动

文章目录 25 KVM管理虚拟机-虚拟机安全启动25.1 总体介绍25.1.1 概述25.1.2 功能说明25.1.3 约束限制 25.2 安全启动实践25.2.1 虚拟机配置25.2.2 证书导入25.2.3 安全启动观测 25 KVM管理虚拟机-虚拟机安全启动 25.1 总体介绍 25.1.1 概述 安全启动(Secure Boot…

基于JAVA的高校宿舍管理系统的设计与实现(论文+源码)_kaic

目 录 1 绪论 1.1 研究背景 1.2 研究目的和意义 1.3 课题任务 1.4 本文结构 2 开发工具及技术介绍 2.1 开发工具介绍 2.2 开发技术介绍 3 系统分析 3.1 可行性分析 3.2 需求分析 4 系统设计 4.1 系统结构设计 4.2 系统功能模块设计 4.3 业务时序设计 4.4 住宿流程设计 4.5 数…

CSS-预编译器-Sass

前言 Sass 是一款强化 CSS 的辅助工具,它在 CSS 语法的基础上增加了变量 (variables)、嵌套 (nested rules)、混合 (mixins)、导入 (inline imports) 等高级功能,这些拓展令 CSS 更加强大与优雅。使用 Sass 以及 Sass 的样式库(如 Compass&am…

【MySQL】MySQL基础知识详解

文章目录 1. MySQL概述1.1 数据库相关概念1.1.1 数据库、数据库管理系统与SQL1.1.2 关系型数据库与数据模型 1.2 MySQL数据库1.2.1 MySQL的安装与配置1.2.2 MySQL服务的启动与停止1.2.3 连接MySQL服务端 2. SQL2.1 SQL简介2.2 DDL2.2.1 数据库操作2.2.2 表操作2.2.2.1 创建表2.…

无任何格外需求的命令行C++飞机大战,内含BOSS,动画,万行代码!免费奉上!

个程序的源码没有什么技术要求,一般至少能看懂95%,因为博主是大一上学期写着玩的,当写了一周,还拿它参加了学校的创意编程比赛,结果第一用的ui,直接降维打击了,拿了个二等奖 操作方法游戏内都有…

OAuth2.0 OIDC1.0及落地方案

目录 一、导语二、初识OAuth2.0三、OAuth2.0四、OIDC1.0五、OAuth2.0 & OIDC1.0授权模式选型建议六、典型架构及示例6.1 用户认证中心6.2 客户端6.3 应用网关6.4 后端API服务 七、附录- OAuth & OIDC常用端点 一、导语 应用的使用离不开用户,所以用户认证与…

缓存架构设计Spring对于Cache的抽象架构

目录 缓存架构设计 JSR107 JSR107核心接口 JSR107图示 Spring对于Cache的抽象架构 介绍 Cacheable CachePut CacheEvict CacheConfig 缓存架构设计 JSR107 首先,来了解一下JSR107规范JSR是Java Specification Requests 的缩写 ,Java规范请求&…

chatgpt赋能Python-python3_ljust

Python 3 ljust - 实现字符串长度对齐的神器 在Python 3中,ljust()是一个非常常用的字符串方法。它可以方便地对齐字符串,并添加左对齐的填充字符。无疑,它是Python编程中不可缺少且十分实用的工具神器。 什么是ljust()? ljust…

MybatisPlus数据层标准的CRUD(增删改查)的实现与分页功能

文章目录 1 标准CRUD使用2 新增3 删除4 修改5 根据ID查询6 查询所有7 Lombok步骤1:添加lombok依赖步骤2:安装Lombok的插件步骤3:模型类上添加注解 8 分页功能步骤1:调用方法传入参数获取返回值步骤2:设置分页拦截器步骤3:运行测试程序 在这一节中我们重点学习的是数据层标准的C…

每日练习---C语言

目录 前言: 1.打印菱形 1.1补充练习 2.打印水仙花 2.1补充训练 前言: 记录博主做题的收获,以及提升自己的代码能力,今天写的题目是:打印菱形、打印水仙花数。 1.打印菱形 我们先看到牛客网的题:OJ链…

利用ChatGPT编写Excel公式,对比讯飞星火与ChatGPT对Excel公式的回答

系列文章目录 借助国内ChatGPT平替MindShow,飞速制作PPT 借助国内ChatGPT平替markmap/Xmind飞速生成思维导图 借助国内ChatGPT平替剪映/百度AIGC平台快速制作短视频 文章目录 系列文章目录前言一、利用ChatGPT编写Excel公式1.描述我们想实现的Excel公式&#xff…

四、医院模块开发

文章目录 一、医院模块开发1、搭建医院模块service-hosp1.1搭建service-hosp1.2修改配置1.3 添加启动类 2、添加医院设置CURD2.1 添加model2.2 添加Mapper2.3 添加service接口及实现类2.4 添加controller2.5 医院设置CRUD2.6 添加controller方法 3、Swagger2介绍与集成4、医院锁…

【Python beautiful soup】如何用beautiful soup 解析HTML内容

美丽汤(Beautiful Soup)是一个流行的Python库,用于从HTML或XML文件中提取数据。它将复杂的HTML文件转化为一个Python对象,使得用户可以更方便地解析、搜索和修改HTML内容。本文将介绍如何使用Beautiful Soup解析HTML内容&#xff…

数据的家——MySQL的数据目录

之前学过了行格式,在往上面是页,最上层的也就学到了页。 现在的数据目录是什么?这之间有什么关系呢?带着这个问题,来继续学习。 数据库和文件系统的关系是什么? InnoDB和MyISAMy 是把表存储在磁盘上面的…

【计算机网络之HTTP篇】HTTPS与HTTP的区别

目录 HTTPS产生的原因 HTTPS工作原理 对称加密 非对称加密 引入数字证书 HTTPS完整工作流程 高频面试题:HTTPS与HTTP的区别 HTTPS产生的原因 HTTP协议是按照文本的形式来明文传递数据的,因此数据很容易被黑客劫持,发生泄密可能。 HTTP…

AlmaLinux 8.8 发布 - RHEL 下游免费发行版(CentOS 稳定版的替代品)

AlmaLinux 8.8 发布 - RHEL 下游免费发行版(CentOS 稳定版的替代品) AlmaLinux OS 是一个开源、社区驱动的项目,旨在提供 CentOS 稳定版的替代品。 请访问原文链接:https://sysin.org/blog/almalinux-8/,查看最新版。…

Linux系统编程——多线程[补充]:懒汉模式自旋锁读者写者问题

0.关注博主有更多知识 操作系统入门知识合集 目录 1.单例设计模式 1.1将线程池设计为懒汉方式实现的单例模式 1.2线程安全版本的懒汉方式 2.STL、智能指针与线程安全 3.自旋锁 4.读者写者问题 1.单例设计模式 在一些软件设计场景当中,要求某些类只能具有一…

五一后“实在高校行”紧锣密鼓走进四所高校,校企合作硕果累累!

近年来,随着人工智能科技的快速发展,越来越多高校加快了与先进企业在培养优秀人才的合作步伐。实在智能一直注重校园生态发展及在人才培养,不断引进数字化人才,做强培训师资;同时积极走出去,在全社会范围内…

2023-05-20:go语言的slice和rust语言的Vec的扩容流程是什么?

2023-05-20:go语言的slice和rust语言的Vec的扩容流程是什么? 答案2023-05-20: go语言的slice扩容流程 go版本是1.20.4。 扩容流程见源码见runtime/slice.go文件中的growslice 函数。 growslice 函数的大致过程如下: 1.如果元…

Mybatis Plus之DQL(条件查询方式、查询投影、查询条件设定、字段映射与表名映射)

文章目录 1 条件查询1.1 条件查询的类1.2 环境构建1.3 构建条件查询1.4 多条件构建1.5 null判定 2 查询投影2.1 查询指定字段2.2 聚合查询2.3 分组查询 3 查询条件3.1 等值查询3.2 范围查询3.3 模糊查询3.4 排序查询 4 映射匹配兼容性问题1:表字段与编码属性设计不同步问题2:编…