【数据结构】详解栈且实现

一.栈

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

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶

出栈:栈的删除操作叫做出栈。出数据也在栈顶

可以类比成,羽毛球和弹夹。

上图理解一下:

栈的实现一般是顺序表。

如果是顺序表的话,我们的栈顶应该要在数组末尾!如果在数组头部的话,数据进栈时还需要挪动其余数据以便数据的存入!效率很

这是实现需要的头文件:

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int SLDatatype;
typedef struct stack
{
    SLDatatype* a;
    int top;
    int capacity;
}SL;
//初始化
void SLinio(SL* ps);
//销毁
void SLdestroy(SL* ps);
//入栈
void SLpush(SL* ps, SLDatatype x);
//出栈
void SLpop(SL* ps);
//栈数据个数
int SLSize(SL* ps);
//判空
bool SLempty(SL* ps);
//栈顶数据
SLDatatype SLtop(SL* ps);


 

初始化

我们要将栈中各个变量进行初始化。

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

入栈

入栈要在数组尾部,记得每次入栈需要判断空间是否够用。

void STpush(ST* p, STDateType x)
{assert(p);if (p->top == p->capacity){int newcapacity = p->capacity == 0 ? 4 : p->capacity * 2;STDateType* tmp = (STDateType*)realloc(p->a, newcapacity * sizeof(STDateType));if (tmp == NULL){perror("realloc failed!");return;}p->a = tmp;p->capacity = newcapacity;}p->a[p->top++] = x;
}

出栈

入栈要在尾部,出栈也要在尾部,后入先出的原则要时刻记住,需要判断是否为空!

void STpop(ST* p)
{assert(p);//出栈的话要判断一下空的情况assert(!STEmpty(p));p->top--;
}

 销毁

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

栈顶数据

在访问栈顶数据时,我们也要先判断栈是否为空,否则当栈为空时,访问栈顶数据便会越界访问!

//栈顶的数据
STDateType STtop(ST* p)
{assert(p);//出栈的话要判断一下空的情况assert(!STEmpty(p));return p->a[p->top-1];
}
 数据个数
//栈的数据个数
int STsize(ST* p)
{assert(p);return p->top;
}

判空

//判空
bool STEmpty(ST* p)
{assert(p);return p->top == 0;
}

好了,我们下期见!

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

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

相关文章

【鸿蒙开发】第二十四章 IPC与RPC进程间通讯服务

1 IPC与RPC通信概述 IPC&#xff08;Inter-Process Communication&#xff09;与RPC&#xff08;Remote Procedure Call&#xff09;用于实现跨进程通信&#xff0c;不同的是前者使用Binder驱动&#xff0c;用于设备内的跨进程通信&#xff0c;后者使用软总线驱动&#xff0c;…

matlab如何画一个全屏和半屏的figure

figure(WindowState, maximized); plot(x, y);如何画一个上半个屏幕的figure screenSize get(0, ScreenSize); upperHalfPosition [screenSize(1), screenSize(2) screenSize(4)/2, screenSize(3), screenSize(4)/2]; figure(Position, upperHalfPosition);

【笔记】EF_PNN获取及运营商名称显示(待完善)

问题背景 当设备无法成功解析EONS(PNN)的值(即SIM卡EF文件内容),则会用次优先级的NITZ去refresh了SPN。(问题代码如下,是通过Phone对象拿到plmn为空) 运营商名称一般显示优先级:Eons > NITZ > XML OPL id 0 对应的是PNN第一条 功能逻辑 (定制)当卡中的spn为空…

如何进行并行执行的诊断与调优 —— 《OceanBase 并行执行》系列 6

在诊断并行执行问题时&#xff0c;我们可以从两个主要方面展开分析。首先&#xff0c;从整体系统层面进行考量&#xff0c;比如检查网络是否畅通、磁盘IO是否过载、CPU资源是否已用满&#xff1b;其次&#xff0c;针对具体的SQL语句进行深入剖析&#xff0c;定位问题SQL&#x…

HTML炫酷的相册

目录 写在前面 HTML简介 完整代码 代码分析 系列推荐 写在最后 写在前面 本期小编给大家带来一个炫酷的旋转相册&#xff0c;快来解锁属于你的独家记忆吧&#xff01; HTML简介 HTML&#xff08;全称为超文本标记语言&#xff09;是一种用于创建网页结构和内容的标记语…

前端笔记-day06

文章目录 01-浮动-基本使用02-浮动-产品布局03-浮动-清除浮动带来的影响04-清除浮动-额外标签法05-清除浮动-单伪元素法06-清除浮动-双伪元素法单伪元素和双伪元素CSS 07-清除浮动-overflow08-flex布局-体验09-flex布局-组成10-flex布局-主轴对齐方式11-flex布局-侧轴对齐方式1…

vuex核心概念-getters

除了state之外&#xff0c;有时我们还需要从state中派生出一些状态&#xff0c;这些状态是依赖state的&#xff0c;此时会用到getters。

景源畅信:小白如何做抖音电商怎么样?

在数字浪潮中崛起的抖音电商&#xff0c;以其独特的平台优势吸引了众多创业者的目光。特别是对于初入电商领域的“小白”来说&#xff0c;如何在这个全新的领域站稳脚跟&#xff0c;成为他们迫切需要解答的问题。接下来&#xff0c;我们将深入探讨小白如何在抖音电商中开辟属于…

课时124:awk实践_进阶知识_逻辑运算

1.2.3 逻辑运算 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 所谓的逻辑运算&#xff0c;其实指的就是 与或非的操作。基本语法格式如下&#xff1a;与&& - 并且关系或|| - 或者关系非&#xff01; - 取反关系简单实…

蓝桥杯备战18.[蓝桥杯 2021 省 AB] 砝码称重

P8742 [蓝桥杯 2021 省 AB] 砝码称重 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; #define endl \n #define int long long const int N 2e510; int a[N],w[N]; signed main() {std::ios::sync_with_stdio(0),cin.tie(0…

Golang的select底层数据结构与特性

select关键字用于处理同时来自多个通道的数据。它的基本工作原理是“随机选择”满足条件的分支去执行。如果没有分支满足条件(即所有通道都无法读/写)&#xff0c;select会阻塞&#xff0c;直到有分支满足条件。如果select包含default分支&#xff0c;当其他分支都不满足条件时…

使用 Python 中的 TensorFlow 检测垃圾短信

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

Python实现对线程的监控及异常时强制杀死线程的技术方案探讨

在Python中&#xff0c;使用threading库创建的线程并没有提供一个直接的方式来“杀死”或强制停止一个线程。这是因为强制终止线程可能会导致程序状态不一致、数据损坏或资源未正确释放等问题。Python设计者选择不在threading模块中提供这样的功能&#xff0c;以鼓励更安全的编…

UIKit常用API:Transform

需求 使用Transform系列的API&#xff0c;该API中提供了旋转、平移等功能。其中函数中带make的效果是只变化一次&#xff0c;不带make可变化多次。此外&#xff0c;还有恢复函数&#xff1a;CGAffineTransformIdentity。 代码实现 注意按钮绑定的是同一个响应事件&#xff0…

漏洞修复:TLS Client-initiated重协商攻击(CVE-2011-1473)

目录 一、漏洞描述 二、漏洞验证 三、实现方式 四、解决方法 1.通过代码添加 2.通过启动参数添加 五、openssl s_client命令 一、漏洞描述 服务器支持 TLS Client-initiated 重协商攻击(CVE-2011-1473)【原理扫描】 使用绿盟等漏洞扫描工具扫描https端口的服务时可能会…

使用Halcon进行图像预处理的策略

图像预处理是机器视觉系统中的一个关键步骤&#xff0c;它有助于提高图像质量&#xff0c;从而使得后续的图像分析和特征提取更加准确。在 Halcon 中&#xff0c;图像预处理通常包括滤波、对比度增强、归一化、边缘增强等操作。以下是一些使用 Halcon 进行图像预处理的策略&…

【React】React的懒加载组件lazy和Suspense

在一个多路由项目中&#xff0c;页面加载时&#xff0c;所有的路由组件都会被加载 如果我们有很多个路由组件&#xff0c;但是用户只点击了几个&#xff0c;这就会有很大的消耗&#xff0c;因此我们需要做懒加载处理&#xff0c;我们点击哪个时&#xff0c;才去加载哪一个 而Re…

2.数据类型与变量(java篇)

目录 数据类型与变量 数据类型 变量 整型变量 长整型变量 短整型变量 字节型变量 浮点型变量 双精度浮点型 单精度浮点型 字符型变量 布尔型变量&#xff08;boolean&#xff09; 类型转换 自动类型转换(隐式) 强制类型转换(显式) 类型提升 字符串类型 数据类…

go使用nacos作为配置中心时遇到的一个错误

docker安装nacos如下&#xff08;有坑&#xff09;&#xff1a; 一文教你使用 Docker 启动并安装 Nacos-阿里云开发者社区 报错如下&#xff1a; read config from both server and cache fail, errread cache file Config Encrypted Data Key failed. cause file doesnt ex…

百亿补贴为什么用 H5?H5 未来会如何发展?

百亿补贴为什么用 H5&#xff1f;H5 未来会如何发展&#xff1f; 本人有一些分析预测。当然&#xff0c;这些分析预测只是个人观点&#xff0c;如果你有不同的意见&#xff0c;欢迎在评论区讨论交流。 百亿补贴为什么用 H5 我们先看两张图&#xff0c;在 Android 手机开发者…