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

【数据结构】栈的实现

💯💯💯

本篇主要利用数组来实现栈,对于栈的各种操作都作详细介绍,压栈,出栈以及获取栈中元素的操作都是学习栈的必备知识,快来学起来吧!!!

  • ©Ⅰ.栈的概念及结构
  • ©Ⅱ.栈的实现
    • 2.1栈的初始化
    • 2.2压栈
    • 2.3出栈
    • 2.4获取栈顶元素
    • 2.5获取栈中有效元素的个数
    • 2.6销毁栈
    • 2.7栈的"打印"

在这里插入图片描述 请添加图片描述

©Ⅰ.栈的概念及结构

栈:是一种特殊的线性表,其只允许在固定的一端进行插入与删除操作。
进行数据的插入和删除的一端称为栈顶,另一端称为栈底。
栈遵循先进后出,后进先出的原则。

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

入栈这里是引用
出栈 在这里插入图片描述

在这里插入图片描述

©Ⅱ.栈的实现

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

//下面是定长的静态栈的结构,实际中一般不用,因为不能扩大容量,所以我们主要实现下面的支持动态增长的栈
#define N 10
typedef int STData;
struct stack1
{int arr[N];//静态数组int top;//栈顶
}ST;//支持动态增长的栈结构
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int STData;//重定义栈使用的数据,如果栈使用的数据不是int类型那么可以通过修改这里从而修改栈的使用数据类型
typedef struct Stack
{int* a;//指向一个数组的指针int top;//栈顶int capicty;//数组容量
}ST;//重命名为ST
//初始化栈表
void STInit(ST*ps);
//销毁栈表
void STDestroy(ST* ps);
//压栈,在栈顶压入一个元素
void STpush(ST* ps,STData x);
//出栈,在栈顶弹出一个元素。
void STpop(ST* ps);
//访问栈顶元素
//获取栈有效数据的大小
int STSize(ST* ps);
STData STTop(ST* ps);
//检查栈是否为空,如果为空返回值为非0,如果是假则返回0;
int STSize(ST* ps);

2.1栈的初始化

因为该数组是动态数组,可以增容,一开始我们可以给数组一定的容量,当数组元素个数等于容量时再进行扩容即可。

不过要注意的是top值应该初始化为几呢?
如果初始化为0,那a[top]表示的是有元素还是没有元素呢?
如果初始化为0的化,那top就表示指向栈顶元素下一个位置的地方。

而如果初始化为-1,那才表示的是栈顶元素的位置。一开始没有元素,top为-1,当有元素压栈进来后,top++,变成0,a[top]上就存在元素了。
两中表示方法都可以,但 要注意表示一种就要一种按照该逻辑进行。

void STInit(ST* ps)//初始化栈表
{assert(ps);//判断结构体指针不为NULL;//一上来可以给栈表初始化容量ps->a = (STData*)malloc(sizeof(STData) * 4);if (ps->a == NULL)//判断是否开辟成功{perror("malloc");}//初始话容量为4ps->capicty = 4;ps->top = 0;//top=0 表示的是指向栈顶元素的下一个位置//top如果为-1,则表示栈顶元素的位置
}

2.2压栈

在元素入栈之前我们需要考虑是否栈空间已满,而需要进行扩容。
所以一开始我们就需要将扩容操作写下。
每次扩容两倍。容量的大小随之改变。
还要注意的是,当入栈后,top是要进行++,然后top就是指向栈顶元素下一个位置的地方了。

void STpush(ST* ps, STData x)//压栈,在栈顶压入一个元素--在压入之前也要考虑是否需要增容
{assert(ps);//断言判断if (ps->top == ps->capicty)//当数组元素等于容量时{//增容STData* tmp = (STData*)realloc(ps->a, sizeof(STData) * ps->capicty * 2);if (tmp == NULL){perror("realloc");}ps->a = tmp;//将扩容的空间赋给aps->capicty *= 2;//数组的容量也随之变大}ps->a[ps->top] = x;//将元素压入栈顶,一开始top是0,当元素进去后,再让top指向该栈顶元素后一个位置ps->top++;
}

2.3出栈

在删除数据之前我们需要考虑栈空间里还有没有数据可以删除,当栈空间里没有数据可删,那就立刻停止。

所以我们首先需要对栈进行检查是否为空。
当栈为空时返回非0,不为空时返回0;

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

而删除数据的操作我们只要让top–即可,不需要释放空间。


void STpop(ST* ps)//出栈,在栈顶弹出一个元素。
{assert(ps);//删除元素之前要检查栈表是否还有元素可删assert(!STEmpty(ps));//当栈表为NULL是断言ps->top--;}

2.4获取栈顶元素

获取栈顶元素也就是top所指向的元素,但要注意每次压入一个数据后top都会++,所以最后top是多加了一次,要想访问最后一个元素也就是栈顶元素需要top-1;

STData STTop(ST* ps)//访问栈顶元素
{assert(ps);//断言判断return ps->a[ps->top - 1];//top-1的位置才是栈顶元素
}

2.5获取栈中有效元素的个数

其实top的数值大小就是栈中有效元素的个数,
一开始top为0,表中没有元素,当有元素时,top就进行++,有一个加一次,有一个加一次,所以最后栈中有效元素的个数就是top的数值

int STSize(ST* ps)//计算栈表长度
{assert(ps);//断言判断return ps->top;//top的长度就是栈表的长度
}

2.6销毁栈

将栈销毁掉也就是让数据都归还操作系统。
开辟的空间需要释放,定义的变量需要置0;

void STDestroy(ST* ps)//销毁栈表
{assert(ps);//断言判断free(ps->a);//释放数值空间ps->a = NULL;//并手动置NULLps->capicty = 0;//置0ps->top = 0;}

2.7栈的"打印"

栈是不能进行打印的,因为栈要求数据后入的要先出,而打印的顺序是先入先出。
想要让栈的数据展现出来,那就要按照它的特点,我们先打印栈顶元素,打印完再将栈顶元素出栈,再打印新的栈顶元素,再出栈,知道栈变成空为止。

void test()
{ST p;STInit(&p);STpush(&p, 1);STpush(&p, 2);STpush(&p, 3);STpush(&p, 4);STpush(&p, 5);printf("%d\n", STSize(&p));//获得栈中有效元素的个数while (!STEmpty(&p)){printf("%d ", STTop(&p));//将栈的数据展现出现,要求先进后出,后进先出STpop(&p);}STDestroy(&p);
}

在这里插入图片描述

请添加图片描述

相关文章:

【数据结构】栈的实现

&#x1f4af;&#x1f4af;&#x1f4af; 本篇主要利用数组来实现栈&#xff0c;对于栈的各种操作都作详细介绍&#xff0c;压栈&#xff0c;出栈以及获取栈中元素的操作都是学习栈的必备知识&#xff0c;快来学起来吧&#xff01;&#xff01;&#xff01;©Ⅰ.栈的概念及…...

【链表OJ题(六)】链表分割

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录链表OJ题(六)1. 链表…...

C++类中的三大函数(构造,析构,拷贝)

下面一段话与大家共勉&#xff1a;每个人的一生都会遇到很多边界&#xff0c;有些边界可以突破&#xff0c;有些则不能。那些无法突破的边界就是你的极限&#xff0c;而划分边界的标准就是“阈值”。每次突破阈值之后&#xff0c;人生轨迹就会发生剧烈变化&#xff0c;其间需要…...

【2024考研】计算机考研,4轮复习时间安排

文章目录&#x1f3a8;第1轮复习&#xff08;暑假前&系统课&#xff09;英语1/2数学1/2专业课408&#x1f3a8;第2轮复习&#xff08;开学前&真题&#xff09;英语1/2试卷数学1/2试卷专业课408试卷&#x1f3a8;第3轮复习&#xff08;报名前&政治&#xff09;政治试…...

(十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据

系列文章: python网络爬虫专栏 目录 序言 本节学习目标 特别申明 4.7 使用BeautfulSoup解析h...

【经验】项目管理:瀑布式、Scrum

1、瀑布式开发 流程关键词关键人员输出立项简述、周期、预算领导立项申请表、立项评审表策划计划项目经理、QA、CM各种计划书&#xff08;项目、配置、测试等&#xff09;&#xff0c;评审需求功能项目经理功能列表、需求规格书、需求开发计划等&#xff0c;评审设计UML开发设…...

Learning C++ No.17【STL No.7】双端队列

引言&#xff1a; 北京时间&#xff1a;2023/3/17/7:18&#xff0c;刚刚快乐的早锻炼回来&#xff08;不对 &#xff0c;应该说回来有一会了&#xff09;&#xff0c;因为此时我已经吃完早饭&#xff0c;洗过澡了&#xff1b;现在回想起上学期&#xff0c;就算是第二天需要晨跑…...

Snackbar

1.简介 位于底部的提示View 支持侧滑消失 同一时间只有一个 不支持跨Activity展示 国内使用率很低 2.基础使用 2.1 基本展示 Snackbar.make(view, "Content", Snackbar.LENGTH_LONG).show()2.2 设置点击事件 注意不设置点击事件回调&#xff0c;点击按钮的文字不…...

HummerRisk 使用教程:主机检测

1. 概述 HummerRisk 是开源的云原生安全平台&#xff0c;以非侵入的方式解决云原生环境的安全和治理问题。核心能力包括混合云的安全治理和容器云安全检测。 本文将介绍HummerRisk中的主机检测部分功能&#xff0c;包括如何管理主机、管理凭证&#xff0c;以及使用主机检测规…...

【Arduino无线气象站项目】

【Arduino无线气象站项目】 1. 概述2. Arduino无线气象站电路图3. 定制设计电路板4. Arduino无线气象站代码5. 总结1. 概述 使用DHT22传感器测量室外温度和湿度,并使用NRF24L01收发器模块将这些数据无线发送到室内机。在室内机,还有另一个用于测量室内温度和湿度的DHT22传感…...

HTTP详解

一&#xff0c;什么是HTTPHTTP(全称为“超文本传输协议”)&#xff0c;是一种应用非常广泛的应用层协议&#xff0c;之前在《初识网络原理》的博客(初识网络原理_徐憨憨&#xff01;的博客-CSDN博客)中&#xff0c;有详细讲解过TCP/IP五层模型&#xff0c;其中应用层描述了数据…...

cpufreq--处理器功耗控制

cpu 功耗控制 参考框架&#xff1a; cpufreq 框架。 cpufreq 框架提供 cpu 功耗管理接口&#xff0c;以及功耗管理方案。 用户可以通过功耗管理接口&#xff08;以文件形式提供&#xff09;来选择管理方案&#xff0c;并设置相关参数。 管理方案的实现则由具体的驱动来完成。…...

做技术,最忌讳东张西望

又好长时间没更新&#xff0c;研二了&#xff0c;忙着做实验、写论文、发论文&#xff0c;再加上给我导做一些事情&#xff08;都习惯了&#xff0c;以前很不爽的事情&#xff0c;现在居然能这么平静的说出来&#xff09;。 但这不是我今天说的重点&#xff0c;而是另外一件事…...

Oracle 常见报错问题汇总

Oracle 常见报错问题汇总 报错:ORA-01017: invalid username/password; logon denied报错:ORA-01031: insufficient privileges报错:"ORA-01034: ORACLE not available" 和 "ORA-27101: shared memory realm does not exist"报错:“ORA-00119: invalid…...

单片机连接有人云上传数据

首先采用有人物联网的模块 &#xff0c;连接有人云平台服务器 看云平台相关配置配置连接设备在线后 添加设备添加设备完成后 添加变量模板 变量模板的添加方式如下 &#xff1a;本次采用的是标准的MODbus 协议添加一个温度变量温度变量如下显示云平台 下发数据 采集01 03 00 00…...

系统集成项目管理工程师:第18章项目风险管理学习笔记

第18章项目风险管理 一、目录 18.1 风险概述 18.1.1 风险的定义 18.1.2 风险的分类 18.1.3 风险的性质 18.2 项目风险管理 18.3 规划风险管理 18.3.1 规划风险管理的输入 18.3.2 规划风险管理的工具与技术 18.3.3 规划风险管理的输出 18.4 识别风险...

【笔试强训选择题】Day3.习题(错题)解析

文章目录 前言一、Day3习题&#xff08;错题&#xff09;解析二、Day3习题&#xff08;原题&#xff09;练习总结前言 今天我们将进入到第三天的练习&#xff0c;希望能一直坚持下去&#xff0c;不断反思总结错误&#xff0c;得到进步&#xff1b; 一、Day3习题&#xff08;错…...

基于GPT-4的免费代码生成工具

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

Android开发的这一年里,Jetpack的Room源码是怎么狠狠奖励我的?

简述 Android Jetpack的出现统一了Android开发生态&#xff0c;各种三方库逐渐被官方组件所取代。Room也同样如此&#xff0c;逐渐取代竞品成为最主流的数据库ORM框架。这当然不仅仅因为其官方身份&#xff0c;更是因为其良好的开发体验&#xff0c;大大降低了SQLite的使用门槛…...

推荐一款卸载软件的小工具-《UninstallToo》

目录 UninstallToo介绍 UninstallToo下载 UninstallToo使用 总结 UninstallToo介绍 Uninstall Tool 是一款可以用来替代“添加/删除程序”的工具。它允许您显示隐藏的安装程序&#xff0c;按名称过滤已安装程序的列表&#xff0c;强行写在程序&#xff0c;浏览注册表项目&a…...

线程池——JUC随记8

线程池使用方式 1、一池N线程&#xff08;Executors.newFixedThreadPool(n)&#xff09; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class ExecutorDemo {public static void main(String[] args) {ExecutorService execu…...

SpringCloudAlibaba微服务调用组件-Feign

SpringCloudAlibaba微服务调用组件-Feign 本项目代码与笔记已存放在Gitee仓库 地址&#xff1a; 代码&#xff0c;笔记 文章目录SpringCloudAlibaba微服务调用组件-Feign1. 什么是Feign1.1 优势2. Spring Cloud Alibaba快速整合OpenFeign1&#xff09;引入依赖2&#xff09;编写…...

高效学习方法论

2023.03.17 《程序员的三门课&#xff1a;技术精进、架构修炼、管理探秘 / 于君泽等著》学习笔记 学会学习一、高效学习的方法1、管理好自己的目标1&#xff09;评估能力2&#xff09;制定目标3&#xff09;评估目标2、利用好碎片时间3、在同一时间只做一件事二、高效学习的途径…...

C语言结构体(一篇学会)

C语言结构体 在C语言中&#xff0c;结构体是一种自定义的数据类型&#xff0c;它允许用户将不同类型的数据组合在一起。结构体由多个变量组成&#xff0c;这些变量称为结构体的成员。结构体成员可以是不同的数据类型&#xff0c;如整数、浮点数、字符或其他结构体等。 结构体…...

嵌入式软件开发之Linux下C编程

目录 前沿 Hello World&#xff01; 编写代码 编译代码 GCC编译器 gcc 命令 编译错误警告 编译流程 Makefile 基础 何为 Makefile Makefile 的引入 前沿 在 Windows 下我们可以使用各种各样的 IDE 进行编程&#xff0c;比如强大的 Visual Studio。但是在Ubuntu 下如何进…...

普通Java工程师 VS 优秀架构师

1 核心能力 1.1 要成为一名优秀的Java架构师 只懂技术还远远不够&#xff0c;懂技术/懂业务/懂管理的综合型人才&#xff0c;才是技术团队中的绝对核心。 不仅仅是架构师&#xff0c;所有的技术高端岗位&#xff0c;对人才的综合能力都有较高的标准。 架构路线的总设计师 规…...

Java:SpringBoot实现ApplicationEvent事件的监听和发布

通过发布订阅模式实现数据的异步处理&#xff0c;比如异步处理邮件发送 新建SpringBoot项目 项目结构 . ├── pom.xml └── src└── main├── java│ └── com│ └── example│ └── demo│ ├── Application.java│ …...

星戈瑞-Sulfo-Cyanine3 azide?磺酸基-Cy3-N3叠氮基水溶性染料

Sulfo-Cyanine3 azide&#xff1f; 品牌&#xff1a;星戈瑞 CAS号&#xff1a;2055138-89-9 外观&#xff1a; 暗红色晶体 分子量&#xff1a;720.83 分子式&#xff1a;C34H45N6NaO8S2 纯度&#xff1a;95% 储藏条件&#xff1a;-20C 下避光保存 Sulfo-Cyanine3 azide 是一种…...

十大经典排序算法(下)

&#x1f353;个人主页&#xff1a;bit.. &#x1f352;系列专栏&#xff1a;Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 HTML和CSS3 目录 1.6 快速排序 1. 算法步骤 2. 动图演示 3.代码实现 1.7 堆排序 1. 算法步骤 2. 动图演示 3. 代码实现 1.8 计数排…...

网络协议分析期末复习(四)

目录 0.前言 1.IP层对改善TCP性能支持的机制 2.TCP防止半开放连接的机制 3.TCP协议中强推位&#xff08;P&#xff09;和紧急位&#xff08;U&#xff09;的用法 4.TCP的流量控制和拥塞控制的异同点 异&#xff1a; &#xff08;1&#xff09;两者的特点不同&#xff1a;…...

wordpress的文章如何备份/好用的搜索引擎

2019独角兽企业重金招聘Python工程师标准>>> 1 进入php源代码目录中的mbstring所在目录cd /usr/local/src/php-5.2.4/ext/mbstring/2 执行php安装后目录中的bin/phpize文件/usr/local/php/bin/phpize3 进入php源代码目录cd /usr/local/src/php-5.2.4/4 执行上述目录…...

温州生活网招聘信息/seo优化排名易下拉软件

用pip 更新 numpy, 提示: Operation notpermitted解决办法: 1. pipinstall --upgrade --ignore-installednumpy2. pipinstall --upgrade --user numpy原因: 是因为os(El Capitan)中加入了新的安全机制SIP(System IntegrityProtection)也可以在重启机器的时候command r 进入恢复…...

南京网站建设工作室/百度扫一扫识别图片在线

1 基础知识Python语言与其他编程语言一样&#xff0c;也支持四则运算(加、减、乘、除)&#xff0c;以及圆括号运算符。在Python语言中&#xff0c;数字分为整数和浮点数。整数就是无小数部分的数&#xff0c;浮点数就是有小数部分的数。例如&#xff0c;下面的代码是标准的四则…...

audio player wordpress 使用方法/bt磁力种子

一、background-attachment属性在CSS中&#xff0c;使用背景附件属性background-attachment可以设置背景图像是随对象滚动还是固定不动。语法&#xff1a;background-attachment:scroll/fixed;说明&#xff1a;background-attachment 属性只有2个属性值。scroll表示背景图像随对…...

进行优化/郑州网站seo

OpenJDK中同时会有好几个项目在进行中。这些项目所带来的修改可能会加入到以后版本的JDK中。本文带你看一下OpenJDK中正在进行的重要项目&#xff0c;提前了解以后版本的JDK中会增加的功能。AmberAmber项目关注的是Java语言的小改动。Amber项目的一些成果已经被添加到JDK中。这…...

网站备案需先做网站吗/2023年7 8月十大新闻

欢迎观看 Microsoft Excel 教程&#xff0c;小编带大家学习 Microsoft Excel 的使用技巧&#xff0c;了解如何在 Excel 中显示或隐藏零值。 在 Excel 中有时希望将零值显示为空单元格&#xff0c;若要执行这一点可以隐藏值。在工作表中隐藏或显示所有零值&#xff0c;选择「Ex…...