数据结构:栈 及其应用

news2024/11/17 1:46:17

逻辑结构:

栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的有序集合 (受限的线性表)。这种数据结构只允许在栈顶进行添加(push)或删除(pop)元素的操作。栈是一种非常基础且重要的数据结构,广泛应用于计算机科学和软件开发中。

栈顶:插入和删除

栈底:固定的 不允许插入和删除

空栈:不含任何元素

栈的基本操作

  1. push(element): 向栈顶添加一个元素。如果栈已满,则可能无法进行此操作。
  2. pop(): 移除栈顶的元素,并返回该元素。如果栈为空,则可能无法进行此操作,并可能返回一个错误或特殊值(如nullundefined)。
  3. peek() 或 top(): 返回栈顶元素的值,但不从栈中移除它。如果栈为空,则可能返回一个错误或特殊值。
  4. isEmpty(): 检查栈是否为空。
  5. size(): 返回栈中元素的数量。

栈的存储结构:

栈可以通过多种方式实现,包括使用数组(或列表)和链表。

顺序存储:
  • 基于数组的栈(顺序栈):在这种实现中,数组的一端被用作栈顶。添加元素时,新元素被添加到数组的末尾;移除元素时,数组的最后一个元素被移除。这种实现方式在大多数编程语言中都非常高效,因为数组的末尾操作通常很快。

初始化:

# define MaxSize 50
typedef struct
{
    Elemtype data[MaxSize];
    int top;//栈顶指针

}SqStack;

//iniiallize
void initStack(SqStack &s){ 
s.top=-1;
}

判断非空:

//empty
bool StackEmpty(SqStack s){
    if(s.top==-1)
    return true;
    else
    return false;
}

 进栈:

//in
bool Push(SqStack &s,Elemtype e){
    if(s.top==MaxSize-1)
    return false;
    else{
        s.top++;
        s.data[s.top]=e;
    }
    return true;
    
}

进栈和出栈的操作 根据s.top的初始值不同而不同:
s.top=-1先指针+1再进栈,先出栈再指针-1;

s.top=0先进栈再指针+1,先指针-1再出栈; 

 出栈:

bool Pop(SqStack &s,Elemtype &e){
    if(s.top==-1)
    return false;
    e=s.data[s.top];
    s.top--;
    return true;
}

读取栈顶元素:

//read
bool GetTop(SqStack s,Elemtype &x){
    if(s.top==-1)
    return false;
    x=s.data[s.top];
return true;
}

 链式存储:
  • 基于链表的栈:下列代码规定没有头结点,LHead指向栈顶元素,链表的头部被用作栈顶。添加元素时,新元素被添加到链表的头部;移除元素时,链表的第一个元素(即头部元素)被移除。虽然链表在随机访问方面不如数组高效,但在某些情况下(如动态内存分配),链表可能更灵活。

//
typedef struct LinkNode
{
    Elemtype data;
    struct LinkNode *next;

}LiStack;

栈的应用

栈的应用非常广泛,包括但不限于:

  • 函数调用

在大多数编程语言中,函数调用是通过栈来实现的。当函数被调用时,其返回地址和局部变量被推入栈中;当函数返回时,这些信息从栈中弹出。

  • 表达式求值

在编译器和解释器中,栈用于计算表达式的值。例如,在解析算术表达式时,可以使用栈来跟踪操作符和操作数。

中缀转后缀:

1)加括号:(( A +③( B *②( C -① D )))-©( E /④ F ))。

2)运算符后移:(( A ( B ( CD )-①)*②)+③( EF )/④)-⑤。

3)去除括号后,得到后缀表达式: ABCD -①*②+③ EF /④-⑤.

在计算机中,中缀表达式转后缀表达式时需要借助一个栈,用于保存暂时还不能确定运算顺序的运算符。从左到右依次扫描中缀表达式中的每一项,具体转化过程如下:
1)遇到操作数。直接加入后缀表达式。
2)遇到界限符。若为"(",则直接入栈;若为")",则依次弹出栈中的运算符,并加入后缀表达式,直到弹出"("为止。注意,"("直接删除,不加入后缀表达式。

3)遇到运算符。若其优先级高于除"("外的栈顶运算符,则直接入栈。否则,从栈顶开始,依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,直到遇到一个优先级低于它的运算符或遇到"("时为止,之后将当前运算符入栈。按上述方法扫描所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式。

转后缀图解(例子):

后缀表达式求值:

通过后缀表示计算表达式值的过程:从左往右依次扫描表达式的每一项,若该项是操作数,则将其压入栈中;若该项是操作符< op >,则从栈中退出两个操作数 Y 和 x ,形成运算指令 X < op > y ,并将计算结果压入栈中。当所有项都扫描并处理完后,栈顶存放的就是最后的计算结果。

后缀求值图解:

  • 括号匹配

栈可以用来检查括号(如圆括号、方括号和花括号)是否正确匹配。

  • 回溯算法

在解决某些问题时(如迷宫问题、八皇后问题等),栈可以用来保存中间状态,以便在需要时回溯到之前的状态。

  • 页面访问历史

在Web浏览器中,栈可以用来保存用户访问的页面历史,以便用户可以通过“后退”按钮返回到之前的页面。

总之,栈是一种简单但功能强大的数据结构,其独特的后进先出原则使得它在许多应用场景中都非常有用。

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

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

相关文章

爆火!大模型算法岗 100 道面试题全解析,赶紧收藏!

大模型应该是目前当之无愧的最有影响力的AI技术&#xff0c;它正在革新各个行业&#xff0c;包括自然语言处理、机器翻译、内容创作和客户服务等等&#xff0c;正在成为未来商业环境的重要组成部分。 截至目前大模型已经超过200个&#xff0c;在大模型纵横的时代&#xff0c;不…

后端学习路线

后端学习路线 一、编程语言 至少需要学习一门编程语言&#xff0c;建议学习JAVA和GO语言。 二、数据库 数据库分为关系型数据库和非关系型数据库&#xff0c;区别在于分关系型数据库常用于大数据&#xff0c;而非关系型数据库一般不在大数据方面使用。 关系型数据库&#x…

重塑未来:组织文化建设助你应对时代挑战

在当今迅速变化的时代&#xff0c;变化已成为不可避免的常态。无论是技术的迅猛发展&#xff0c;还是市场需求的瞬息万变&#xff0c;个人和组织都必须学会适应和迎接变化。本文将探讨变化的重要性&#xff0c;并通过系统思维和敏捷方法论的视角&#xff0c;阐述如何有效地管理…

ai生产力 输出内容变现新方式 AI头像生成教程和变现方式分析

ai生产力 输出内容变现新方式 AI头像生成教程和变现方式分析&#xff1a;特别是以AI头像与壁纸生成为例&#xff0c;我们可以详细分析其制作过程和变现方式。 制作过程 选择合适的AI工具&#xff1a; 在市场上&#xff0c;存在多款AI生成图像的工具&#xff0c;如Stable Diff…

OJ在线评测系统 后端判题机架构搭建 使用原生实现Java安全管理器环境隔离

原生实现安全管理器环境隔离 限制用户的操作权限 文件 网络 执行 Java安全管理器 SecurityManager 来实现更严格的限制 是 Java 提供的保护 JVM Java安全的机制 可以实现更严格的资源和操作限制 编写安全管理器 只需要继承 SecurityManager类 我们可以从这个参数perm参数拿…

软件测试学习笔记丨curl命令发送请求

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32332 一、简介 cURL是一个通过URL传输数据的&#xff0c;功能强大的命令行工具。cURL可以与Chrome Devtool工具配合使用&#xff0c;把浏览器发送的真实请求还原出来&#xff0c;附带认证信…

Spring Boot打造:小徐影院管理平台

第1章 概述 1.1 研究背景 随着现代网络技术发展&#xff0c;对于小徐影城管理系统现在正处于网络发展的阶段&#xff0c;所以对它的要求也是比较严格的&#xff0c;要从这个系统的功能和用户实际需求来进行对系统制定开发的发展方式&#xff0c;依靠网络技术的的快速发展和现代…

【Mysql】Mysql数据库基本操作-------DDL(上)

1、DDL解释 DDL&#xff08;Data Definition Language&#xff09;&#xff0c;数据定义语言&#xff0c;该语言部分包括以下内容&#xff0c; &#xff08;1&#xff09;对数据库的常用操作 &#xff08;2&#xff09;对表结构的常用操作 &#xff08;3&#xff09;修…

【Qt】编写第一个Qt程序 对象树 内存泄漏问题探讨

编写第一个Qt程序 1. 使用图形化界面生成2. 使用代码生成3. 对象树3.1什么是对象树3.2 验证对象树 4. 解决编码问题 1. 使用图形化界面生成 创建好一个项目后&#xff0c;我们可以点击 widget.ui 进入图形化界面设计&#xff0c;可以直接通过拖拽的方式进行添加。 通过拖拽的方…

群体神经科学中的社会公正:避免数据分析中的社会构建误用

TLDR&#xff1a;有意思的观点。文章作者强调&#xff0c;使用群体神经科学大数据时&#xff0c;研究人员必须承担起伦理和科学责任&#xff0c;避免对边缘化群体造成进一步的污名化。通过像ABCD这样的开放数据集&#xff0c;研究人员应避免将种族、性别等简单化处理为独立变量…

「JavaScript深入」聊一聊 new操作符具体干了什么?

JavaScript深入 — new操作符 概念流程手写new操作符 概念 在JavaScript中&#xff0c;new 操作符用于创建一个给定构造函数的实例对象 function Person(name, age){this.name name;this.age age; } Person.prototype.sayName function () {console.log(this.name) } cons…

记一次从登录框到内网横向

前言 接到公司通知要对某某行业做渗透测试&#xff0c;挖一些尽可能高危的漏洞&#xff0c;于是便有了接下来的故事。 0x01 信息收集 首先收集了十几个该行业相关的网站&#xff0c;然后一个个做信息收集&#xff0c;先列出来可利用的点。 1.某某公司为YouDianCMS&#xff08…

车载诊断技术:汽车健康的守护者

一、车载诊断技术的发展历程 从最初简单的硬件设备到如今智能化、网络化的系统,车载诊断技术不断演进,为汽车安全和性能提供保障。 早期的汽车诊断检测技术处于比较原始的状态,主要依靠操作经验和主观评价。随着汽车工业的发展,车载诊断技术也经历了不同的阶段。20 世纪初…

Java生成Markdown格式内容

前一篇写的是markdown格式的文本内容转换保存为word文档&#xff0c;是假定已经有一个现成的markdown格式的文本&#xff0c;然后直接转换保存为word文档&#xff0c;不过在开发中&#xff0c;通常情况下&#xff0c;数据是从数据库中获取&#xff0c;拿到的数据映射到java对象…

趋势外推法

趋势外推法主要利用图形识别法和差分法计算&#xff0c;进行模型的基本选择。 一、图形识别法。 这种方法是通过绘制散点图来进行的&#xff0c;即将时间序列的数据绘制成以时间 t 为横轴、时序观察值为纵轴的图形&#xff0c;观察并将其变化曲线与各类函数曲线模型的图形进行…

物联网系统中高精度温度检测方案_温度变送器

01 物联网系统中为什么要使用温度变送器 在物联网系统中使用温度变送器的原因主要可以归纳为以下几点&#xff1a; 1、温度监测与控制 实时数据获取&#xff1a;温度变送器能够将温度这一物理量转换为可传输的标准化电信号&#xff08;如4-20mA电流信号、0-10V电压信号或RS48…

Spring Boot 进阶-Spring Boot 开发第一个Web接口

在前面的文章中我们对Spring Boot的配置以及日志配置有了大概的了解,在我们搭建完成第一个Spring Boot项目之后也提到了一个概念就是RestFul风格的接口开发。下面我们就来详细介绍一下使用Spring Boot如何去开发一个RestFul的Web接口。 准备 在开发接口之前,需要引入的就是W…

一文上手Kafka【中】

一、发送消息细节 在发送消息的特别注意: 在版本 3.0 中&#xff0c;以前返回 ListenableFuture 的方法已更改为返回 CompletableFuture。为了便于迁移&#xff0c;2.9 版本添加了一个方法 usingCompletableFuture&#xff08;&#xff09;&#xff0c;该方法为 CompletableFu…

【工具类】证书自动续签免费版 正式发布

证书自动续签免费版 正式发布 1.控制台首页2.申请证书2.1.支持自动解析和手动解析两种模式2.2.LB&#xff08;负载均衡&#xff09;支持主流的云厂商2.3.CDN&#xff08;内容分发&#xff09; 支持主流的云厂商2.4.对象存储&#xff08;OSS&#xff09;支持主流云厂商2.5DCDN&a…

TDengine 在业务落地与架构改造中的应用实践!

前言 在物联网和大数据时代&#xff0c;时序数据的管理和分析变得至关重要。TDengine&#xff0c;作为一款专为时序数据设计的开源数据库&#xff0c;以其卓越的存储和查询效率&#xff0c;成为众多企业优化数据架构的优选。本文将分享我将TDengine成功应用于实际业务的经验&am…