深入理解栈和队列(一):栈

个人主页:17_Kevin-CSDN博客

专栏:《数据结构》


一、栈的概念

栈(Stack)是一种特殊的线性表,它遵循后进先出(Last-In-First-Out,LIFO)的原则。栈可以被看作是一个只能在一端进行操作的线性表,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底它的基本操作包括入栈(Push)和出栈(Pop)。

栈可以想象成一个垂直放置的木板,上面有一些盘子。栈的特点是最后放入的盘子会被放在最上面,而要取出盘子时,只能从最上面开始取。这就是后进先出的原则,也就是说,最后放入栈的元素会首先被取出。

二、栈的结构

栈的大致结构如上,只能从固定的端口(栈顶)压栈和出栈。

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

三、栈的代码实现

以C语言作为语言基础,数组作为储存结构实现栈的压栈,出栈等操作

为什么使用数组实现栈?

原因如下:

  1. 随机访问:数组可以通过索引快速地访问任何元素,而链表需要遍历才能找到指定的元素。在栈的操作中,我们通常只关心栈顶元素,因此数组的随机访问特性可以提供更好的性能。
  2. 内存效率:数组在内存中是连续存储的,而链表中的每个节点都需要额外的指针空间。对于栈来说,数组的内存效率更高,因为它不需要额外的指针来维护栈的结构。
  3. 常数时间操作:数组的入栈和出栈操作可以在常数时间内完成,因为它们只需要修改栈顶指针。而链表的入栈和出栈操作需要遍历链表,因此时间复杂度为 O(n)。

栈的创建

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

栈的初始化

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

栈的销毁

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

压栈和出栈

压栈

void STPush(ST* ps, STDataType x)
{assert(ps);// 如果空间不够,扩容if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity = newcapacity;}ps->a[ps->top] = x;ps->top++;
}

 我们用数组来实现栈,用指针指向的区域扩容来表示数组,往进存结构体。当 ps->top == ps->capacity 的时候说明数组内的空间满了,不足以进行压栈,所以进行if内的扩容处理。

在数组容量足够的时候直接在对应的top位置上进行赋值,实现压栈,最终用top++来实现数据的同步刷新。

出栈

void STPop(ST* ps)
{assert(ps);assert(!STEmpty(ps));ps->top--;
}

出栈的处理简单粗暴。

我们将 top-- 后其实就无法修改和读取之前top - 1位置的值了,而在压栈的时候他是对top位置的空间直接赋值,所以不用担心之前的该位置存的值是多少。

读取栈顶

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

栈内数据数量

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

四、栈的应用

栈在编程中有很多应用,例如:

  1. 函数调用:在函数调用中,栈用于保存函数的参数、局部变量和返回地址。
  2. 表达式求值:在表达式求值中,栈用于按照运算符的优先级和结合性对表达式进行求值。
  3. 括号匹配:在处理括号嵌套的代码时,栈可以用于检查括号是否匹配。
  4. 递归:在递归算法中,栈用于保存函数的调用信息和返回地址。

五、总结

栈是一种重要的数据结构,它遵循后进先出的原则。栈的基本操作包括入栈、出栈、查看栈顶元素和检查栈是否为空。栈可以使用数组或链表来实现,并且在编程中有很多应用。希望这篇博客对你理解栈有所帮助!


 

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

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

相关文章

【python】爬取杭州市二手房销售数据做数据分析【附源码】

一、背景 在数据分析和市场调研中,获取房地产数据是至关重要的一环。本文介绍了如何利用 Python 中的 requests、lxml 库以及 pandas 库,结合 XPath 解析网页信息,实现对链家网二手房销售数据的爬取,并将数据导出为 Excel 文件的过…

多特征变量序列预测(11) 基于Pytorch的TCN-GRU预测模型

往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测(一)数据集介绍和预处理-CSDN博客 风速预测(二)基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

springcloud修炼——Eureka注册中心

如果你要理解这个技术博客博客专栏 请先学习以下基本的知识: 什么是微服务什么是服务拆分什么是springcloud Springcloud为微服务开发提供了一个比较泛用和全面的解决框架,springcloud继承了spring一直以来的风格——不重复造轮子,里面很多的…

【NLP笔记】Transformer

文章目录 基本架构EmbeddingEncoderself-attentionMulti-Attention残差连接LayerNorm DecoderMask&Cross Attention线性层&softmax损失函数 论文链接: Attention Is All You Need 参考文章: 【NLP】《Attention Is All You Need》的阅读笔记 一…

WPF按钮相关

跟着官网敲的按钮相关的内容,还涉及了wpf很多其他的知识 1.创建基本按钮 <Grid><StackPanel HorizontalAlignment"Left"><Button>Button1</Button><Button>Button2</Button><Button>Button3</Button></StackPan…

如何在gitee上fork github上面的项目,并保持同步更新

前言 当看到github上面比较好的项目&#xff0c;想用到自己的项目&#xff0c;又不想仓库别人看&#xff0c;同时网络不好&#xff0c;囊中又羞涩的情况下&#xff0c;怎么办&#xff1f; 可以考虑用gitee来同步更新github上面的项目。 一、在gitee创建私有仓库 新建的是选择…

Windows电脑设置自动关机的教程

前言 说来也是搞笑&#xff1a;朋友跟我诉苦说&#xff0c;他有时候下班忘了关闭电脑&#xff0c;结果经常因为电脑不关机导致被领导扣工资。 说到扣工资这个问题&#xff0c;直接仲裁就好啦&#xff01;哈哈哈&#xff0c;突然又是一波泼天的富贵来临&#xff0c;这必须要接住…

计算方法——数据拟合

1、引入&#xff1a;单变量数据拟合 原先的插值要求给出的数据点要在拟合的函数上&#xff0c;但数据拟合&#xff0c;只需整体“近似”&#xff0c;不强求所有的数据点一致 假设给出数据&#xff1a; 那么 偏差 的定义为&#xff1a; 但是偏差“大小”&#xff0c;最好是用绝…

计算机网络:数据交换方式

计算机网络&#xff1a;数据交换方式 电路交换分组交换报文交换传输对比 本博客介绍计算机之间数据交换的三种方式&#xff0c;分别是电路交换、分组交换以及报文交换。 电路交换 我们首先来看电路交换&#xff0c;在电话问世后不久&#xff0c;人们就发现要让所有的电话机都…

c++类和对象(中)类的6个默认成员函数及const成员函数

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今日主菜&#xff1a;类和对象 主厨&#xff1a;邪王真眼 所属专栏&#xff1a;c专栏 主厨的主页&#xff1a;Chef‘s blog 前言&#xff1a; 咱们之前也是…

【开发环境搭建篇】IDEA安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

C语言——结构体自定义类型

目录 结构体类型 声明结构体 结构体的特殊声明 创建结构体变量和初始化结构体变量 结构体的自引用 结构体内存对齐 对齐规则 内存对齐存在意义 默认对齐数的修改 结构体传参 结构体实现位段 了解位段是什么 位段的内存分配 位段有跨平台的问题及使用注意事项 C语言…

Spark-Scala语言实战(3)

在之前的文章中&#xff0c;我们学习了如何在来如何在IDEA离线和在线安装Scala&#xff0c;想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实…

[Halcon学习笔记]标定常用的Halcon标定板规格及说明

1、介绍 大多数标定的要求都是以实心圆或方格来作为标志点&#xff0c;所以一般的标定板为棋盘格或矩阵圆点图&#xff0c;高精度的相机标定过程中&#xff0c;大多是以比较明确的特征点来作为参考&#xff0c;所以通过识别标定板的圆形&#xff0c;拟合出精确的中心位置&…

3.19总结

A计划 题解&#xff1a;这题其实就是一个很简单的三维搜索&#xff0c;有了一个传送门&#xff0c;并且要确定是否传过去的对应位置是墙&#xff0c;防止被装死&#xff0c;同事呢又要在对应的t时间内完成&#xff08;不一定要卡着t时间恰好完成&#xff09; #include<ios…

linux单机部署hadoop

1.下载安装包 https://archive.apache.org/dist/hadoop/common/ 2.上传压缩 3.修改配置文件 1)设置JDK的路径 cd /usr/local/software/hadoop-3.1.3/etc/hadoop vi hadoop-env.sh export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.402.b06-1.el7_9.x86_64/ 查看…

1Panel应用推荐:Nginx Proxy Manager

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

springBoot---过滤器,监听器,拦截器

过滤器&#xff0c;监听器&#xff0c;拦截器 一、理解它们 看里十几篇博客&#xff0c;总算有点小明白&#xff0c;总的来讲&#xff0c;两张图可以让我看明白点。 通过两幅图我们可以理解拦截器和过滤器的特点 1、过滤器 过滤器是在请求进入tomcat容器后&#xff0c;但请求…

2024流星全自动网页生成系统重构版源码

2024流星全自动网页生成系统重构版源码 源码介绍 流星全自动网页生成系统重构版源码分享&#xff0c;所有模板经过精心审核与修改&#xff0c;完美兼容小屏手机大屏手机&#xff0c;以及各种平板端、电脑端和360浏览器、谷歌浏览器、火狐浏览器等等各大浏览器显示。 为用户使…

【第十五章】改进神经网络学习方式-手写数字识别重新编码实现

让我们来实现我们在之前讨论过的想法。我们将开发一个新的程序&#xff0c;network2.py&#xff0c;这是我们之前开发的程序 network.py 的改进版本。如果你有一段时间没有看过 network.py&#xff0c;那么花几分钟快速阅读之前的讨论可能会有所帮助。它只有 74 行代码&#xf…