当前位置: 首页 > news >正文

数据结构数组栈的实现

在这里插入图片描述

Hello,今天我们来实现一下数组栈,学完这个我们又更进一步了。

一、栈

栈的概念

栈是一种特殊的线性表,它只允许在固定的一端进行插入和删除元素的操作。
进行数据的插入和删除只在栈顶实现,另一端就是栈底。
栈的元素是后进先出。

压栈:栈的数据进入就是压栈
出栈:栈的数据删除就叫出栈

我们画一个原理图让大家比较好理解一下。

在这里插入图片描述

这一过程叫做pop出栈

我们上述的过程都是在栈顶实现出栈入栈,并不能像顺序表和单链表那样从任意位置删除和增加,但这就是栈的性质,我们后面会讲它的作用。

实现栈我们可以用链表产生节点的方式链接他们,但是也可以用数组下标访问的方式,类似顺序表这样的方法
那这两个方法哪个好呢,我们来比较一下。

因为栈的性质我们不得从栈顶出栈和入栈,如果我们实现的时候是链表的方式,那必然会存在一个问题,就是我们的时间复杂度是O(N)我们需要遍历一遍数组,这样的话栈好像变得“土”,所以用数组的方式更快的提高效率,

二、栈的定义

typedef int StackDataType;
#define N 100
struct Stack
{StackDataType arry[N];StackDataType top;
};

这是静态栈,在顺序表的时候我们就讲过静态栈存在缺点,最大的缺点就是不能开辟空间,100个最多只能存100个数据,如果我只使用10个int空间就存在浪费了,如果我要存储1000个数据,我们的空间又不够了,这就会造成一系列问题,所以我们改一下,变成动态栈,我们来实现一下吧。

typedef int StackDataType;
typedef struct Stack
{StackDataType* arry;int top;int capacity;
}Stack;

有了结构体还是老样子,我们来实现一下接口函数,开整!
初始化栈

void StackInit(Stack* pst)
{assert(pst);pst->arry = NULL;pst->capacity = pst->top = 0;
}

初始化栈这个大家肯定会了。

销毁


void StackDestory(Stack* pst)
{assert(pst);free(pst->arry);pst->capacity = pst->top = 0;}

判断栈是否为空

bool StackEmpty(Stack* pst)
{assert(pst);return pst->top == 0;
}

现在我们要实现一个入栈的方法,入栈的时候我们需要检查一下我们的内存空间是不是满了,和顺序表一样的道理,如果满了我们就需要扩容。所以在入栈的时候需要判断一下它空间有没有满。

void StackPush(Stack* pst, StackDataType x)
{assert(pst);if (pst->capacity == pst->top){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;StackDataType* tmp = (StackDataType*)realloc(pst->arry, sizeof(int) * newcapacity);if (tmp == NULL){printf("realloc fail\n");exit(-1);}pst->arry = tmp;pst->capacity = newcapacity;}pst->arry[pst->top - 1] = x;pst->top++;}

这和我们顺序表的尾插一摸一样,现在看大家肯定觉得简单很多了。
有了入栈,那就有出栈。

void StackPop(Stack* pst)
{assert(pst);if (pst->top > 0){pst->top--;}
}

因为我们上面写了一个判断该数是不是为空我们也可以写成

void StackPop(Stack* pst)
{assert(pst);if (!StackEmpty(pst)){pst->top--;}
}

返回栈顶数据

StackDataType StackTop(Stack* pst)
{assert(pst);return pst->arry[pst->top - 1];
}

统计栈里有多少数

int StackSize(Stack* pst)
{assert(pst);return pst->top;
}

完整代码

#pragma once#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
//typedef int StackDataType;
//#define N 100
//struct Stack
//{
//	StackDataType arry[N];
//	StackDataType top;
//};typedef int StackDataType;
typedef struct Stack
{StackDataType* arry;int top;int capacity;
}Stack;void StackInit(Stack* pst);void StackDestory(Stack* pst);bool StackEmpty(Stack* pst);void StackPush(Stack* pst, StackDataType x);void StackPop(Stack* pst);StackDataType StackTop(Stack* pst);int StackSize(Stack* pst);

#include"Stack.h"void StackInit(Stack* pst)
{assert(pst);pst->arry = NULL;pst->capacity = pst->top = 0;
}void StackDestory(Stack* pst)
{assert(pst);free(pst->arry);pst->capacity = pst->top = 0;}bool StackEmpty(Stack* pst)
{assert(pst);return pst->top == 0;
}void StackPush(Stack* pst, StackDataType x)
{assert(pst);if (pst->capacity == pst->top){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;StackDataType* tmp = (StackDataType*)realloc(pst->arry, sizeof(int) * newcapacity);if (tmp == NULL){printf("realloc fail\n");exit(-1);}pst->arry = tmp;pst->capacity = newcapacity;}pst->arry[pst->top - 1] = x;pst->top++;}void StackPop(Stack* pst)
{assert(pst);if (pst->top > 0){pst->top--;}
}void StackPop(Stack* pst)
{assert(pst);if (!StackEmpty(pst)){pst->top--;}
}StackDataType StackTop(Stack* pst)
{assert(pst);return pst->arry[pst->top - 1];
}int StackSize(Stack* pst)
{assert(pst);return pst->top;
}

栈的应用也有很多,后面会分享给大家,我们下次再见

相关文章:

数据结构数组栈的实现

Hello&#xff0c;今天我们来实现一下数组栈&#xff0c;学完这个我们又更进一步了。 一、栈 栈的概念 栈是一种特殊的线性表&#xff0c;它只允许在固定的一端进行插入和删除元素的操作。 进行数据的插入和删除只在栈顶实现&#xff0c;另一端就是栈底。 栈的元素是后进先出。…...

成集云 | 抖店连接器客户静默下单催付数据同步钉钉 | 解决方案

源系统成集云目标系统 方案介绍 随着各品牌全渠道铺货&#xff0c;主播在平台上直播时客户下了订单后不能及时付款&#xff0c;第一时间客户收不到提醒&#xff0c;不仅造成了客户付款率下降&#xff0c;更大量消耗了企业的人力成本和经济。而成集云与钉钉深度合作&#xff0…...

【算法专题突破】双指针 - 复写零(2)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;1089. 复写零 - 力扣&#xff08;Leetcode&#xff09; 我先来读题&#xff0c; 题目的意思非常的简单&#xff0c;其实就是&#xff0c; 遇到 0 就复制一个写进数组&a…...

【Java从0到1学习】11 Java集合框架

1. Collection 1.1 Java类中集合的关系图 1.2 集合类概述 在程序中可以通过数组来保存多个对象&#xff0c;但在某些情况下开发人员无法预先确定需要保存对象的个数&#xff0c;此时数组将不再适用&#xff0c;因为数组的长度不可变。例如&#xff0c;要保存一个学校的学生信…...

uniapp使用uni.chooseLocation()打开地图选择位置

使用uni.chooseLocation()打开地址选择位置&#xff1a; 在Uniapp源码视图进行设置 添加这个属性&#xff1a;"requiredPrivateInfos":["chooseLocation"] ​ </template><view class"location_box"><view class"locatio…...

学习笔记|课后练习解答|电磁炉LED实战|逻辑运算|STC32G单片机视频开发教程(冲哥)|第八集(下):课后练习分析与解答

文章目录 课后练习解答需求分解增加KEY3控制代码如下&#xff1a; 第一版代码问题分析Tips&#xff1a;STC-ISP的设置 Tips&#xff1a;定时器实现完整电磁炉显示功能的代码测试流程 总结 课后练习解答 增加按键3&#xff0c;按下后表示启动&#xff0c;选择的对应的功能的LED…...

前端高频面试题 js中堆和栈的区别和浏览器的垃圾回收机制

一、 栈(stack)和 堆(heap) 栈(stack)&#xff1a;是栈内存的简称&#xff0c;栈是自动分配相对固定大小的内存空间&#xff0c;并由系统自动释放&#xff0c;栈数据结构遵循FILO&#xff08;first in last out&#xff09;先进后出的原则&#xff0c;较为经典的就是乒乓球盒结…...

自然语言处理:大语言模型入门介绍

自然语言处理&#xff1a;大语言模型入门介绍 语言模型的历史演进大语言模型基础知识预训练Pre-traning微调Fine-Tuning指令微调Instruction Tuning对齐微调Alignment Tuning 提示Prompt上下文学习In-context Learning思维链Chain-of-thought提示开发&#xff08;调用ChatGPT的…...

使用秘籍|如何实现图数据库 NebulaGraph 的高效建模、快速导入、性能优化

本文整理自 NebulaGraph PD 方扬在「NebulaGraph x KubeBlocks」meetup 上的演讲&#xff0c;主要包括以下内容&#xff1a; NebulaGraph 3.x 发展历程NebulaGraph 最佳实践 建模篇导入篇查询篇 NebulaGraph 3.x 的发展历程 NebulaGraph 自 2019 年 5 月开源发布第一个 alp…...

对于pycharm 运行的时候不在cmd中运行,而是在python控制台运行的情况,如何处理?

对于pycharm 运行的时候不在cmd中运行&#xff0c;而是在python控制台运行的情况&#xff0c;如何处理&#xff1f; 比如&#xff0c;你在运行你的代码的时候 它总在python控制台运行&#xff0c;十分难受 解决方法 在pycharm中设置下即可&#xff0c;很简单 选择运行点击…...

Spring MVC 二 :基于xml配置

创建一个基于xml配置的Spring MVC项目。 Idea创建新项目&#xff0c;pom文件引入依赖&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.12.RELEASE</version>…...

springboot aop方式实现接口入参校验

一、前言 在实际开发项目中&#xff0c;我们常常需要对接口入参进行校验&#xff0c;如果直接在业务代码中进行校验&#xff0c;则会显得代码非常冗余&#xff0c;也不够优雅&#xff0c;那么我们可以使用aop的方式校验&#xff0c;这样则会显得更优雅。 二、如何实现&#xf…...

解决git上传远程仓库时的大文件提交

在git中超过100M的文件会上传失败&#xff0c;而当一个文件超过50M时会给你警告&#xff0c;如下 warning: File XXXXXX is 51.42 MB; this is larger than GitHubs recommended maximum file size of 50.00 MB 解决这种问题&#xff0c;首先在项目的.git文件夹中找到.gitigno…...

HTML学习笔记02

HTML笔记02 页面结构分析 元素名描述header标题头部区域的内容&#xff08;用于页面或页面中的一块区域&#xff09;footer标记脚部区域的内容&#xff08;用于整个页面或页面的一块区域&#xff09;sectionWeb页面中的一块独立区域article独立的文章内容aside相关内容或应用…...

<C++> 内存管理

1.C/C内存分布 让我们先来看看下面这段代码 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] {1, 2, 3, 4};char char2[] "abcd";char *pChar3 "abcd";int *ptr1 (int *) mal…...

【Java】ByteBuffer类的arrayOffset方法详解+示例

arrayOffset功能详解;arrayOffset在position等于0和非0两种场景下的demo。使用类java.nio.ByteBuffer中的arrayOffset()方法可以获得这个缓冲区的第一个元素在底层支持(backing)数组中的偏移量。 如果这个buffer底层是由数组支持的,那么buffer的postion p对应于数组的index…...

【C++】C++ 引用详解 ⑤ ( 函数 “ 引用类型返回值 “ 当左值被赋值 )

文章目录 一、函数返回值不能是 " 局部变量 " 的引用或指针1、函数返回值常用用法2、分析函数 " 普通返回值 " 做左值的情况3、分析函数 " 引用返回值 " 做左值的情况 函数返回值 能作为 左值 , 是很重要的概念 , 这是实现 " 链式编程 &quo…...

Git,分布式版本控制工具

1.为常用指令配置别名&#xff08;可选&#xff09; 打开用户目录&#xff0c;创建.bashrc文件 &#xff08;touch ~/.bashrc&#xff09; 2.往其输入内容 #用于输出git提交日志 alias git-loggit log --prettyoneline --all --graph --abbrev-commit #用于输出当前目录所有文…...

LeetCode 面试题 02.02. 返回倒数第 k 个节点

文章目录 一、题目二、C# 题解 一、题目 实现一种算法&#xff0c;找出单向链表中倒数第 k 个节点。返回该节点的值。 注意&#xff1a;本题相对原题稍作改动 点击此处跳转题目。 示例&#xff1a; 输入&#xff1a; 1->2->3->4->5 和 k 2 输出&#xff1a; 4 说…...

SpeedBI数据可视化工具:丰富图表,提高报表易读性

数据可视化工具一大作用就是能把复杂数据可视化、直观化&#xff0c;更容易看懂&#xff0c;也就更容易实现以数据驱动业务管理升级&#xff0c;因此一般的数据可视化工具都会提供大量图形化的数据可视化图表&#xff0c;以提高报表的易懂性&#xff0c;更好地服务企业运营决策…...

Qwen3.5-4B-Claude-Opus实战案例:用该模型辅助撰写RFC文档与技术决策说明

Qwen3.5-4B-Claude-Opus实战案例&#xff1a;用该模型辅助撰写RFC文档与技术决策说明 1. 模型特性与RFC文档撰写需求 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF作为一款专注于推理分析的AI模型&#xff0c;其结构化思维和分步骤回答能力特别适合技术文档撰写场景…...

Mac/Win/Linux全平台实测:用Ollama一键部署DeepSeek-R1 7B模型,附硬件配置建议

Mac/Win/Linux全平台实测&#xff1a;用Ollama一键部署DeepSeek-R1 7B模型&#xff0c;附硬件配置建议 去年在帮创业团队搭建本地AI开发环境时&#xff0c;我试遍了市面上所有开源模型部署方案。当Ollama首次支持DeepSeek-R1时&#xff0c;其跨平台兼容性让我眼前一亮——同一套…...

3步掌握Open Props:从环境搭建到高级应用

3步掌握Open Props&#xff1a;从环境搭建到高级应用 【免费下载链接】open-props CSS custom properties to help accelerate adaptive and consistent design. 项目地址: https://gitcode.com/gh_mirrors/op/open-props Open Props是一个功能强大的CSS变量库&#xff…...

OpenClaw+GLM-4.7-Flash:3个提升开发效率的自动化脚本

OpenClawGLM-4.7-Flash&#xff1a;3个提升开发效率的自动化脚本 1. 为什么选择这个技术组合&#xff1f; 作为一名长期在终端里摸爬滚打的开发者&#xff0c;我一直在寻找能够真正融入日常工作的AI助手方案。直到遇到OpenClawGLM-4.7-Flash这个组合&#xff0c;才找到了理想…...

6.其他计算机系统基础知识

一、其他计算机系统基础知识 &#xfeff;00:00 1. 计算机语言 &#xfeff;00:31 1&#xff09;计算机语言的概念 &#xfeff;01:56 定义: 用于人与计算机之间交流的语言&#xff0c;是传递信息的媒介组成结构: 表达式: 包含变量、常量、字面量和运算符流程控制: 包括分支、循…...

Homebrew国内镜像源对比:如何为MacOS M2快速安装Pandoc并配置Typora

Homebrew国内镜像源深度评测&#xff1a;M2 Mac高效安装Pandoc与Typora配置指南 作为Markdown写作的重度用户&#xff0c;我曾在M1 Pro和M2 Max芯片的MacBook上反复折腾Pandoc的安装过程。最令人头疼的不是软件本身&#xff0c;而是Homebrew那令人抓狂的下载速度——有时一个简…...

实战对比:Vamana/HNSW/NSG三大图算法在百维向量搜索中的性能差异

百维向量搜索实战&#xff1a;Vamana/HNSW/NSG三大图算法性能横评 在当今数据爆炸的时代&#xff0c;高效处理高维向量搜索已成为推荐系统、图像识别和自然语言处理等领域的核心技术瓶颈。面对百维甚至更高维度的向量数据&#xff0c;传统暴力搜索方法早已力不从心&#xff0c;…...

Phi-4-Reasoning-Vision效果展示:红外图像+可见光图像跨模态推理

Phi-4-Reasoning-Vision效果展示&#xff1a;红外图像可见光图像跨模态推理 1. 多模态推理工具概览 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具&#xff0c;专为双卡RTX 4090环境优化。这个工具最令人印象深刻的是它能够处…...

探索视频采集技术:OBS Studio实现高效直播录制的创新方法

探索视频采集技术&#xff1a;OBS Studio实现高效直播录制的创新方法 【免费下载链接】obs-studio OBS Studio - 用于直播和屏幕录制的免费开源软件。 项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio 在当今内容创作领域&#xff0c;视频采集技术是直播与…...

OpenClaw+GLM-4.7-Flash:学术论文辅助写作全流程

OpenClawGLM-4.7-Flash&#xff1a;学术论文辅助写作全流程 1. 为什么需要AI辅助学术写作 作为一名经常需要撰写学术论文的研究者&#xff0c;我深刻体会到写作过程中的痛点。从海量文献中筛选关键信息、整理参考文献格式、反复修改论文结构&#xff0c;这些工作往往耗费大量…...