栈的核心原理

1 栈的概念及结构

栈是一种特殊的线性表,其特点是只允许在固定的一端进行插入和删除操作。进行操作的一端称为栈顶,另一端称为栈底

栈中的元素遵循后进先出(LIFO,Last In First Out) 原则。

  • 压\入\进栈(Push):在栈顶插入元素的操作
  • 出栈(Pop):从栈顶删除元素的操作

 

2 栈的实现

栈可以通过数组或链表实现,数组实现更为高效(尾插尾删的时间复杂度为 O (1))。

 

2.1 栈的结构定义及声明

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>typedef STDataType;//定义
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;// 初始化
void STInit(ST* pst);// 销毁
void STDestroy(ST* pst);// 插入数据(入栈)
void STPush(ST* pst, STDataType x);//删除数据(出栈)
void StackPop(ST* pst);// 获取栈顶元素
STDataType STTop(ST* pst);// 栈的判空
bool STEmpty(ST* pst);// 栈的大小(获取栈中数据个数)
int STSize(ST* pst);

2.2 核心操作实现

1.初始化

// 初始化
void STInit(ST* ps)
{assert(ps);ps->a = NULL;ps->top = 0;      // 设定初始栈顶为0,表示无元素ps->capacity = 0;
}

2.销毁

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

3.入栈操作

原本栈为空时,top 为-1,为了便于写代码,令为 0

 原本 top 指向栈顶元素的,没有元素时候,指向 -1,不指向 0。

所以对于上述两种情况,

情况一:

top 指向栈顶数据。

情况二:

top 指向栈顶数据的下一个位置。

// 插入数据(入栈)
void STPush(ST* ps, STDataType x)
{assert(ps);// 检查容量,不足则扩容if (ps->top == ps->capacity)//相等就扩容{int newCapacity = ps->capacity == 0 ? 4 : ps->capacity* 2;//最初时候都是0,刚开始开空间开4个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++;
}

4.出栈操作

void StackPop(ST* ps)
{assert(ps);// 栈顶下移即完成出栈    ps->top--;                 
}

5.获取栈顶元素

// 获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);//assert(!STEmpty(ps));assert(ps->top > 0);//避免空栈return ps->a[ps->top - 1];
}

6.栈的判空

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

 7.栈的大小

// 栈的大小(获取栈中数据个数)
int STSize(ST* ps)
{assert(ps);return ps->top;
}

2.3 测试一下

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"int main()
{ST s;STInit(&s);STPush(&s, 1);STPush(&s, 2);STPush(&s, 3);STPush(&s, 4);//访问元素while (!STEmpty(&s)){printf("%d ", STTop(&s));STPop(&s);}STDestroy(&s);return 0;
}

 

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

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

相关文章

【无标题】暗物质暗能量——以下是用11维拓扑量子色动力学模型解释暗物质和暗能量的完整理论框架。

暗物质暗能量——以下是用11维拓扑量子色动力学模型解释暗物质和暗能量的完整理论框架。暗物质的拓扑本质 1. 跨桥零模振动理论 暗物质对应跨桥结构的基态振动模&#xff1a; math \phi_{\text{DM}} \frac{1}{\sqrt{6}} \sum_{f1}^6 \mathcal{B}_f^{(0)} $$ 其中 $\mathcal{B}…

【接口自动化】-1- 初识接口

一、什么是接口 接口涉及到四个实体&#xff1a;&#xff08;我去饭店点餐&#xff09; 我是客人 &#xff1a;客户端 厨师&#xff1a;服务器 服务员&#xff1a;接口 菜单&#xff1a;接口文档 接口定义了一套信息规则让两个系统之间互相不必知道对方的内部&#xff0c…

华为FTTR光猫V173 F30改公开版界面 附带真正的s161补全一体固件

【本文介绍】 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 这款FTTR的V173 F30看着颜值很高 也很实用 毕竟是XGPON万兆的光猫…

【学习】数字化车间与智能工厂如何推进制造业转型

在制造业转型升级的浪潮中&#xff0c;数字化车间与智能工厂已成为推动产业变革的核心引擎。前者通过物联网、大数据与自动化技术的深度融合&#xff0c;实现生产流程的精细化管控与资源优化&#xff1b;后者则依托人工智能、5G通信与数字孪生技术&#xff0c;构建起具备自感知…

HTML元素与高级功能完全教程:从基础到精通

目录 章节1:HTML的灵魂——元素的本质与结构化思维 1.1 元素的核心:标签、属性与内容 1.2 语义化的革命 1.3 常见的“坑”与避坑指南 章节2:表单元素:打造交互的基石 2.1 表单基础:与核心控件 2.2 高级输入类型与验证 2.3 表单的可访问性与用户体验 章节3:HTML5多媒…

IP证书:构建数字世界知识产权安全防线的基石

引言 在数字化浪潮席卷全球的今天&#xff0c;知识产权&#xff08;IP&#xff09;的保护已成为企业、机构乃至个人面临的重要挑战。无论是商业秘密、专利技术&#xff0c;还是数字版权&#xff0c;其安全性和可信度都直接影响着创新生态的健康发展。而作为数字安全的核心工具…

CAD插件『PDF转CAD格式』安装教程

在工程设计领域&#xff0c;常规流程是将完成的CAD图纸直接转换为PDF格式或输出为纸质蓝图进行分发。由于PDF文件具有跨平台兼容性强、防篡改等特性&#xff0c;在工程交付环节被广泛采用。但当需要对既有图纸进行二次修改时&#xff0c;PDF格式的编辑局限性便凸显出来&#xf…

【硬件-笔试面试题】硬件/电子工程师,笔试面试题-26,(知识点:硬件电路的调试方法:信号追踪,替换,分段调试)

目录 1、题目 2、解答 一、信号追踪法&#xff08;Signal Tracing&#xff09; 原理 操作步骤 应用场景 二、替换法&#xff08;Replacement Method&#xff09; 原理 操作要点 应用场景 三、分段调试法&#xff08;Segmented Debugging&#xff09; 原理 操作步骤…

Qt中QObject类的核心作用与使用

一、QObject类简介 各位小伙伴&#xff0c;在Qt的世界里&#xff0c;QObject类就像是"万物之母"&#xff0c;它是Qt对象模型的核心基类。几乎所有的Qt类都直接或间接地继承自QObject。QObject提供了很多重要的功能&#xff0c;比如对象树管理、信号与槽机制、元对象系…

TVBOXOS6.0双端APP二开源码完整版全开源源码重构版

今天介绍的TVBOXOS手机版App源码采用了纯64位的前端架构&#xff0c;版本则基于本站修正过的6.0前端进行构建。经过多次优化&#xff0c;这款应用不仅操作流畅&#xff0c;界面设计也颇具美感。前端完全集成了安卓原生Java架构&#xff0c;而后端管理采用的是PHP的如意系统。前…

VoWiFi技术深度解析:架构、流程与演进

在蜂窝网络覆盖盲区实现高清语音通话的秘密,就藏在这套基于IMS的Wi-Fi呼叫系统中 一、VoWiFi概述与技术价值 VoWiFi(Voice over Wi-Fi)是一种基于IMS核心网的语音通信技术,允许用户通过Wi-Fi接入运营商的EPC(演进分组核心网)和IMS系统,实现与传统蜂窝网络无缝集成的语音…

DuoPlus云手机再上新:统一配置品牌型号、代理分组与便捷搜索功能全面提升!

前言&#xff1a;在这个日新月异的时代&#xff0c;每一个微小的变化都可能引领行业新潮流&#xff0c;DuoPlus云手机基于不断创新的原则&#xff0c;把用户的需求放在第一位&#xff0c;不断对产品进行调整优化&#xff0c;致力于给用户最全面的产品体验。DuoPlus通过收集用户…

C/C++内存陷阱:为何返回局部变量地址是“定时炸弹”?

资料合集下载链接: ​https://pan.quark.cn/s/472bbdfcd014​ 在编程世界里,有些错误就像是隐藏在代码里的“定时炸弹”,平时可能相安无事,但在某个不经意的时刻就会引爆,导致程序崩溃或出现无法解释的诡异行为。今天,我们要拆解的,就是这样一个极具迷惑性又极其危险的…

编程与数学 03-001 计算机组成原理 21_服务器计算机组成实例解析

编程与数学 03-001 计算机组成原理 21_服务器计算机组成实例解析一、引言二、硬件架构特点&#xff08;一&#xff09;多核/多处理器设计&#xff08;二&#xff09;大容量高带宽内存&#xff08;三&#xff09;存储系统&#xff08;四&#xff09;高可用性设计三、性能优化技术…

opencv简介(附电子书资料)

概述 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;广泛应用于图像处理、目标检测、模式识别等领域&#xff0c;是计算机视觉领域最常用的工具之一。电子书学习资料&#xff1a;https://pan.quark.cn…

纳米编辑器之Nano 编辑器退出**的详细操作指南

以下是关于 Nano 编辑器退出的详细操作指南&#xff0c;涵盖多种常见场景及技巧&#xff1a; 基础退出与保存操作 ✅保存修改并退出&#xff08;最常用&#xff09;快捷键触发退出&#xff1a;按下 Ctrl X[1][2][4]。确认保存&#xff1a;若需保存改动&#xff0c;按 Y&#x…

<HMI><威纶通><触摸屏>基于威纶通MT8106iQ触摸屏,实现自定义登录窗口(优化)

前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如…

visual studio 性能调试

调试 -> 性能查看器 -> CPU使用率 -> 开始 -> 外部代码 -> 调用树。如果外部代码中没有啥东西&#xff0c;则先清理&#xff0c;再生成一遍。在 Visual Studio 中获取类似截图中详细的函数级耗时分析&#xff08;尤其针对 DLL 中的函数&#xff09;&#xff0c;…

Java JVM

前言 JVM是Java的重要组成部分&#xff0c;对于我这个Cpper转Javaer也需要认真学习才对。 一、JVM内存结构 #mermaid-svg-rYtbHArIPV8iAK9I {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-rYtbHArIPV8iAK9I .erro…

便捷删除Android开发中XML中重复字符串资源的一个办法

从android系统源码中移植一些app到android studio开发的时候可能会遇到字符串重复的编译报错。一个办法是把重复的删除&#xff0c;只剩余一条即可。例如下面的编译错误&#xff1a;Found item String/abc more than one time但是呢&#xff0c;xml中一般这种重复的很多很多&am…