【数据结构】“栈”的模拟实现

news2025/1/16 5:10:21

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • ⭐️一、什么是栈
  • 💬二、栈的分类
  • 📅三、用动态数组实现栈
    • 1.栈的结构体定义
    • 2.初始化
    • 3.栈的销毁
    • 4.压栈
    • 5.出栈
    • 6.获取栈顶元素
    • 7.获取栈内元素
    • 判断栈是否为空

⭐️一、什么是栈

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

🔸压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
🔸出栈:栈的删除操作叫做出栈。出数据也在栈顶

在这里插入图片描述

💬二、栈的分类

1️⃣ Ⅰ 顺序存储结构
在这里插入图片描述
实用性不高。
2️⃣ Ⅱ 链式存储结构
在这里插入图片描述

📅三、用动态数组实现栈

使用动态内存管理函数,实现数组动态化。有关动态内存函数的详细讲解可点击查看
👉 内存函数详解

1.栈的结构体定义

注意:这里我们将栈顶初始化是-1。你也可以是0;
代码:

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

2.初始化

代码:

//初始化
void STInit(ST* p)
{
	p->a = NULL;
	p->capacity = 0;
	p->top = 0;
}

3.栈的销毁

代码:

//栈的销毁
void STDesdroy(ST* p)
{
	assert(p);
	free(p->a);
	p->a = NULL;
	p->capacity = p->top = 0;
}

4.压栈

代码:

//压栈
void STPush(ST* p, STDataType x)
{
	assert(p);
	//开辟空间
	if (p->capacity = p->top)
	{
		int newcapacity = p->capacity == 0 ? 4 : p->capacity * 2;//开辟空间个数 
		STDataType* tmp = (STDataType*)realloc(p->a, sizeof(STDataType) * newcapacity);//开辟
		if (tmp == NULL)
		{
			perror("realloc fail\n");
		}
		p->a = tmp;//将开辟好的空间指回原指针
		p->capacity = newcapacity;
	}
	p->a[p->top] = x;
	p->top++;
}

5.出栈

代码:

//出栈
void STPop(ST* p)
{
	assert(p);
	assert(p->top >= 0);
	p->top--;
}

6.获取栈顶元素

//获取栈顶元素
STDataType STTop(ST* p)
{
	assert(p);
	assert(p->top > 0);
	return p->a[p->top];
}

7.获取栈内元素

//大小
int STSize(ST* p)
{
	assert(p);
	return p->top;
}

判断栈是否为空

代码:

//是否为空
bool STisEmpty(ST* p)
{
	if (p->top == 0)
	{
		return false;
	}
	return true;
}

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

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

相关文章

java线程的优先级、守护线程的概念

1.线程的调度 抢占式调度 非抢占式调度 1.1 抢占式调度 优先级越高,抢到cpu的概率越高 1.2 守护线程 守护线程,非守护线程。当其他的非守护线程执行完毕以后,守护线程会陆续结束。 守护线程的应用场景

SpringBoot06---前端路由VueRouter

单页面应用,意思是只有一个html,变化的内容是不同组件进行切换,每个组件加载网络请求,渲染对应的数据,这个内容就是学习怎么完成组件切换 以网易云音乐为例: 网易云音乐 (163.com) 现在无需注册&#xf…

力扣 377. 组合总和 Ⅳ

题目来源:https://leetcode.cn/problems/combination-sum-iv/description/ C题解(来源代码随想录): 本题求的是排列总和,而且仅仅是求排列总和的个数,并不是把所有的排列都列出来。动规五部曲分析如下&…

【STM32】FreeRTOS消息队列和信号量学习

一、消息队列(queue) 队列是一种用于实现任务与任务之间,任务与中断之间消息交流的机制。 注意:1.数据的操作是FIFO模式。 2.队列需要明确数据的大小和队列的长度。 3.写和读都会出现堵塞。 实验:创建一个消息队列…

keil下载程序具体过程:概述

一、前言 keil下载程序具体过程将由一系列的博客组成,将深入探讨keil这种IDE下载镜像文件时具体做了哪些事情。我们平常下载镜像的时候,只是点击了一下Download按钮,剩下的都由keil替代我们完成了。本系列博客将揭示这一过程,keil…

Dynamic Web TWAIN Crack,文档扫描SDK

Dynamic Web TWAIN Crack,文档扫描SDK Dynamic Web TWAIN用于快速部署 Web 应用程序的文档扫描 SDK,文档扫描SDK,,超过 5300 家公司信任 Dynamic Web TWAIN ,因其稳健性和安全性而受到超过 5300 家公司的信赖,Dynamic …

大数据-玩转数据-Flink RedisSink

一、添加Redis Connector依赖 具体版本根据实际情况确定 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-redis_2.11</artifactId><version>1.1.5</version> </dependency>二、启动redis 参…

JVM 基础

巩固基础&#xff0c;砥砺前行 。 只有不断重复&#xff0c;才能做到超越自己。 能坚持把简单的事情做到极致&#xff0c;也是不容易的。 JVM 类加载机制 JVM 类加载机制分为五个部分&#xff1a;加载&#xff0c;验证&#xff0c;准备&#xff0c;解析&#xff0c;初始化&am…

手把手带你跑通网站上线全流程(一个简单的HTML和Python服务端完整上线流程)

我将向你介绍如何将一个网站部署到公网&#xff0c;包含完整流程。 前端静态网站 静态网站文件 首先需要准备一个简单的网页文件用于展示页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&quo…

docker 安装elasticsearch、kibana

下载es镜像 docker pull elasticsearch 启动es容器 docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -d elasticsearch 验证es界面访问 ​​​​​http://节点ip:9200/ ​…

三.SpringBoot整合Elasticsearch

SpringBoot整合Elasticsearch 前言一.java调用es的方式和工具二.java集成Elasticsearch-Rest-Client1.引入pom2.导入版本不一致问题3.编写配置类4.测试类4.1 执行前4.2 执行后 5.其他篇章 前言 我们整合es直接给es发请求就可以了&#xff0c;但是现在有很多方式去调用es的接口…

为什么需要智能指针?

为什么需要智能指针&#xff1f; 解决忘记释放内存导致内存泄漏的问题。解决异常安全问题。 #include<iostream> using namespace std;int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");return a / b; } void Func(…

入门指南 | 如何系统搭建自己的营销战略学习体系成为领域专家?

独自进入一个行业&#xff0c;如果你没有几年的行业经验或者独特的营销方式&#xff0c;很难在行业里站住脚&#xff08;每个行业潜规则都很多&#xff09;。 每个行业都有周期&#xff0c;都有很多竞争对手&#xff0c;你扎进去一个具体的行业&#xff0c;对于各种资源有限的自…

Mysql 和Oracle的区别

、mysql与oracle都是关系型数据库&#xff0c;Oracle是大型数据库&#xff0c;而MySQL是中小型数据库。但是MySQL是开源的&#xff0c;但是Oracle是收费的&#xff0c;而且比较贵。 1 2 mysql默认端口&#xff1a;3306&#xff0c;默认用户&#xff1a;root oracle默认端口&…

FileZilla Server安装配置使用说明

作者&#xff1a;John 链接&#xff1a;https://www.zhihu.com/question/20577011/answer/2360828234 来源&#xff1a;知乎 第一步&#xff1a;右键点击”立即下载“ 第二步&#xff1a;服务器端点击&#xff0c;“windows平台”版本 第三步&#xff1a;这个安装最新的“Fi…

时序预测 | Matlab实现基于GRNN广义回归神经网络的电力负荷预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 时序预测 | Matlab实现基于GRNN广义回归神经网络的电力负荷预测模型 1.Matlab实现基于GRNN广义回归神经网络的电力负荷预测模型 2.单变量时间序列预测; 3.多指标评价,评价指标包括:R2、MAE、MBE等,代码质量极高…

由浅入深学习Tapable

文章目录 由浅入深学习TapableTapable是什么Tapable的Hook分类同步和异步的 使用Sync*同步类型钩子基本使用bailLoopWaterfall Async*异步类型钩子ParallelSeries 由浅入深学习Tapable webpack有两个非常重要的类&#xff1a;Compiler和Compilation。他们通过注入插件的方式&a…

机器学习笔记 - 基于PyTorch + 类似ResNet的单目标检测

一、获取并了解数据 我们将处理年龄相关性黄斑变性 (AMD) 患者的眼部图像。 数据集下载地址,从下面的地址中,找到iChallenge-AMD,然后下载。 Baidu Research Open-Access Dataset - DownloadDownload Baidu Research Open-Access Datasethttps://ai.baidu.com/bro…

2000-2021年全国31省经济高质量发展综合指数(熵值法)(含stata do文档计算代码)

2000-2021年全国31省经济高质量发展综合指数熵值法(包括数据和计算代码) 1、时间&#xff1a;2000-2021年 3、范围&#xff1a;31省 4、来源&#xff1a;整理自中经网和统计NJ 5、指标&#xff1a;GDP增长率、研发投入强度、投资效率、技术交易活跃度、需求结构、城乡结构、…

vue3+ts+vite手把手教你创建Vue3项目

概述 简介&#xff1a; 图文详解&#xff0c;带你使用 Vite 从零到一搭建 Vue3 项目&#xff0c;快速完成项目基建 技术栈&#xff1a; Vue3 TypeScirpt Vite Element-plus 内容&#xff1a; husky代码提交校验、router安装及模块化路由、动态路由siadebar封装、less/scss使…