数据结构:栈
文章目录一、栈1.1 栈的基本概念1.2 栈的储存方式1.2.1 顺序储存一、栈1.1 栈的基本概念回顾线性表第一相同类型第二n个有限序列。在逻辑上是连续的除了第一个和最后一个都有前驱和后继栈也是一种线性表栈只能在它的一端进行插入和删除这一端叫做栈顶而另外一段叫做栈底。不包含任何元素的空表就叫做空栈。栈中的数据遵循后进先出(LIFO)。栈区的地址是从高地址到低地址的出栈和压栈示例一 答案为4解析第一种情况e等d出栈再入栈最后依次出栈顺序为d ecba第二种情况d出栈后c出栈然后e出栈依次类推有三种顺序分别为dc ebadcb eadcba e示例二 答案为n-1栈中的p1p2p3可能的取值2132,4,5,…,n1231,4,5,…,n1,2431,2,5,…,n因此可能取到除3以外的任何一个数字。1.2 栈的储存方式顺序表和链表的区别不同点顺序表链表存储空间上在物理结构上一定连续逻辑结构一定连续物理结构不一定连续随机访问(用下标)支持不支持任意位置插入或者删除元素可能需要搬移元素效率低只需要修改指针插入动态顺序表空间不够需要扩容没有容量的概念按需申请释放应用场景元素高效存储频繁访问任意位置插入和删除频繁缓存利用率(CPU高速缓存)高低一般频繁使用尾插和尾删这种就可以考虑顺序表如果是中间插入或者删除考虑用链表CPU高速缓存内存和硬盘是常用的两个存储它们的区别是1、内存的速度是比硬盘快的2、内存是带电存储硬盘是不带电存储。对于一张图片电脑会将这张图片存在内存中如果没有电了内存就不能存储这张图片就保存不了如果我们想将这张图片存在硬盘中就需要保存这个图片。如上图所示首先我们要清楚的是i这个变量是存在内存中的当我们要实现i这句代码时我们是通过CPU来进行对i进行的我们可以看出它不是对内存i的位置而是将i的位置给一个eax的寄存器然后对这个寄存器后再将寄存器放到i这个位置去。为什么是这样呢因为它们不同频CPU太快了当它想访问内存时如果内存数据比较小(4字节或者8字节)它就加载到寄存器。如果内存数据比较大就加载到3级缓存(L1、L2、L3)中去。上图左边是一个顺序表和链表它们的数据都是1234都存在内存中现在CPU要去访问内存首先CPU会去访问缓存这时缓存中什么都没有因此不命中。然后对于顺序表当我的CPU去访问时这时1为不命中就会将顺序表中的数据拿到缓存中去拿多少数据是取决于CPU的字长的。然后拿2时就会命中。同理后面的数据都会命中因此这就是缓存利用率高。对于链表首先访问1时不命中然后将链表拿到缓存中去但是链表的地址是很大可能不连续的后面的也是很大可能不命中的而且会造成缓存污染缓存的大小是有限的如果将没有用的拿进去之前没有使用的数据就会被寄出去。栈是只允许在一端进行元素插入和删除操作的特殊线性表。而线性表有顺序和链式两种存储结构故栈也有顺序和链式两种存储结构。那是顺序储存好还是链式储存好呢顺序存储好1.2.1 顺序储存跟顺序表类似栈的顺序存储实现可以使用静态数组我们称为静态顺序栈也可以使用堆上动态申请数组实现我们称为动态顺序栈。静态顺序栈的缺陷跟静态顺序表类似只适用于确定知道最多需要多少空间的场景因此主要介绍动态顺序栈。静态顺序栈的定义#define10MAX_SIZEtypedefintSTDataType;typedefstruct{STDataType arr[MAX_SIZE];inttop;//标记栈顶}Stack;动态顺序栈的定义typedefintSTDataType;typedefstruct{STDataType*arr;inttop;//标记栈顶intcapacity;//容量}Stack;栈的初始化voidStackInit(Stack*s){assert(s);s-arr(STDataType*)malloc(4*sizzeof(STDataType));//开辟四个元素的空间if(s-arrNULL){perror(StackInit::malloc);return;}// 初始化时top 0表⽰top指向的是栈顶元素的下⼀个位置// 初始化时top -1表⽰top指向的是栈顶元素s-top0;s-capacity4;}//或者不开辟空间voidStackInit(Stack*s){assert(s);s-arrNULL;s-tops-capacity0;}入栈voidStackPush(Stack*s,STDataType x){assert(s);//扩容if(s-tops-capacity){intnewcapacitys-capacity0:4?2*s-capacity;STDataType temp(STDataType*)realloc(s-arr,sizeof(STDataType)*newcapacity);if(tempNULL){perror(StackPush::realloc);return;}s-arrtemp;s-capacitynewcapacity;//入栈s-arr[s-top]x;}出栈voidStackPop(Stack*s){assert(s);//判断是否为空如为空就没有出栈的必要if(!StackEmpty(s))s-top--;}获取栈顶元素STDataTypeStackTop(Stack*ps){assert(ps);if(!StackEmpty(s))returns-arr[s-top-1];//top0,指向的是栈顶下一个位置}获取栈中有效元素个数intStackSize(Stack*s){assert(s);returns-top;}检测栈是否为空boolStackEmpty(Stack*s){assert(s);returnps-top0;}栈的销毁voidStackDestory(Stack*s){assert(s);if(s-arr){free(s-arr);s-arrNULL;s-top0;s-capacity0;}}打印栈intmain(){Stack s;StackInit(s);StackPush(s,1);StackPush(s,2);StackPush(s,3);StackPush(s,4);//在打印栈顶元素之时也需要出栈while(!StackEmpty(s)){printf(%d ,StackTop(s));StackPop(s);}

相关新闻

《AI辅助前端开发-3:提示词生成篇》

《AI辅助前端开发-3:提示词生成篇》

1. 提示词的三要素角色 任务 约束条件① 角色(你是谁?)错误示范正确示范“帮我写一个登录页面”“你是一个资深前端开发,擅长React TypeScript,请帮我写一个登录页面”“这段代码哪里错了”“你是一个代码审查专家&…

2026/7/17 6:15:31阅读更多 →
TVA:具身智能技术生态的强力引擎(3)

TVA:具身智能技术生态的强力引擎(3)

前沿技术介绍:AI智能体视觉(TVA,Transformer-based Vision Agent)是依托Transformer架构与“因式智能体”理论所构建的颠覆性工业视觉技术,属于“物理AI” 领域的一种全新技术形态,完成了从“虚拟世界”到“…

2026/7/17 6:10:30阅读更多 →
Spring Cloud Config 生产级密钥安全管理:从加密原理到七项核心实践

Spring Cloud Config 生产级密钥安全管理:从加密原理到七项核心实践

1. 项目概述:为什么生产环境的密钥安全是生死线 在微服务架构里,配置管理是个老生常谈的话题,Spring Cloud Config 作为其中的佼佼者,让配置的集中管理和动态刷新变得优雅。但不知道你有没有过这样的“后背发凉”时刻:…

2026/7/17 6:10:30阅读更多 →
VovNet网络解析:GPU优化的高效图像分类方案

VovNet网络解析:GPU优化的高效图像分类方案

1. VovNet网络结构解析:专为GPU计算优化的高效图像分类方案在计算机视觉领域,网络结构设计一直面临着计算效率与模型性能的平衡难题。2018年提出的VovNet(Visual Object-aware Volume Network)通过独特的"逐层特征复用"…

2026/7/17 7:20:35阅读更多 →
Linux Mint 22.3 Zena 安装优化全指南

Linux Mint 22.3 Zena 安装优化全指南

1. Linux Mint 22.3 Zena 核心定位解析 作为Linux Mint的最新LTS版本,22.3代号"Zena"延续了该发行版一贯的"开箱即用"理念。我在实体机和虚拟机分别进行了完整生命周期测试,最直观的感受是其对硬件资源的优化程度——在4GB内存的十代…

2026/7/17 7:20:35阅读更多 →
Nvidia显卡双系统安装指南:Windows 11与EndeavourOS

Nvidia显卡双系统安装指南:Windows 11与EndeavourOS

1. 项目概述作为一名长期在Linux和Windows双系统环境下工作的开发者,我最近又经历了一次"经典"的双系统安装过程——在搭载Nvidia显卡的机器上部署Windows 11和EndeavourOS。这次安装过程中遇到了几个典型问题:Nvidia驱动冲突、GRUB引导丢失、…

2026/7/17 7:20:35阅读更多 →
Windows 11与Ubuntu 26.04双系统安装指南

Windows 11与Ubuntu 26.04双系统安装指南

1. 从Windows 11迁移到Ubuntu 26.04:双系统安装全记录作为一名长期使用Windows系统的开发者,最近决定尝试将Ubuntu 26.04作为第二操作系统安装在电脑上。这个决定源于对Linux系统开源生态的好奇,以及工作中对更高效开发环境的需求。本文将详细…

2026/7/17 7:20:35阅读更多 →
工业控制中0~10V信号转换与PWM技术应用

工业控制中0~10V信号转换与PWM技术应用

1. 工业控制中的0~10V信号需求解析在工业自动化领域,模拟量信号传输是设备间通信的基础方式之一。0~10V电压信号因其简单可靠的特性,被广泛应用于变频器控制、传感器供电、执行机构驱动等场景。与4~20mA电流信号相比,0~10V电压信号具有布线简…

2026/7/17 7:20:35阅读更多 →
Hermes桌面版AI助手跨平台安装与配置完整指南

Hermes桌面版AI助手跨平台安装与配置完整指南

最近在尝试部署AI助手时,发现Hermes桌面版因其便捷的图形化界面和强大的功能集成备受关注。但实际安装过程中,不少开发者会遇到环境配置复杂、依赖冲突等问题。本文将基于官方文档和社区实践,整理一套完整的Hermes桌面版安装指南,…

2026/7/17 7:15:35阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/16 8:28:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/16 6:53:04阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/16 12:02:41阅读更多 →
VS Code 高效配置与个性化定制全攻略

VS Code 高效配置与个性化定制全攻略

1. VS Code 高效配置基础作为一款轻量级但功能强大的代码编辑器,VS Code 的默认配置已经能满足基本需求,但通过合理调整设置可以大幅提升编码效率。我使用 VS Code 已经有五年多时间,期间尝试过各种配置方案,总结出这套适合大多数…

2026/7/17 0:00:01阅读更多 →
从竞赛代码到桌面工具:让 SuperADD 与 SubspaceAD 真正跑进自己的图像

从竞赛代码到桌面工具:让 SuperADD 与 SubspaceAD 真正跑进自己的图像

在异常检测领域,很多优秀算法最初都是以研究代码的形式发布的。它们能够在固定测试集上复现实验结果,却不一定能被普通用户直接拿来测试自己的图片。尤其是最近很多算法仅提供在固定测试集的测试环境,而gradio的demo演示也不会提供。 对工程应用和在自己的图片上进行测试来…

2026/7/17 0:00:01阅读更多 →
WinRAR高效配置指南:从基础安装到高级压缩实战

WinRAR高效配置指南:从基础安装到高级压缩实战

前几天帮同事处理一个客户发来的压缩包,解压时系统自带的工具弹出一串乱码,换用 WinRAR 却顺利打开了。这种看似简单的场景,恰恰暴露了不同压缩工具在处理非标准编码、分卷压缩或加密文件时的差异。WinRAR 作为一款老牌工具,真正价…

2026/7/17 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/16 20:13:14阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/16 8:58:42阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/16 17:10:26阅读更多 →