栈的应用-四则运算表达式求值

news2024/11/28 6:39:11

文章目录

  • 栈的应用-四则运算表达式求值
    • 1. 后缀(逆波兰)表示法
    • 2. 后缀(逆波兰)表达式计算
    • 3. 中缀表达式转换成后缀表达式

栈的应用-四则运算表达式求值

1. 后缀(逆波兰)表示法

我们平时写的数学计算表达式是中缀表达式,表示左操作数+操作符+右操作数,形如 a + b * c的就叫做中缀表达式。

但是计算机对于计算中缀表达式却有困难,计算机先依次将 a+b 放入栈中,这个时候应该计算吗?如果计算了,很明显答案是错误的,因为后面还有乘法*, 乘法的优先级是要比加法高的。如果碰到有括号的表达式,如(a + b) * (c - d) , 就更为复杂了。

对此,一种不需要括号,适应栈结构的表达式后缀表达式可以解决计算机计算的困难。

中缀表达式后缀表达式
a + b + cab+c+
a + b * cabc*+

后缀表达式的表示方法:运算数顺序不变,运算符按优先级进行排布

2. 后缀(逆波兰)表达式计算

【题目链接】:LCR 036. 逆波兰表达式求值

思路:要用到一个栈空间,用于存放运算数

在这里插入图片描述

代码实现:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
      stack<int> st;
      for (auto &e : tokens)
      {
        if (e == "+" || e == "-" || e == "*" || e == "/")
        {
          // 如果e是操作符,出两次栈,进行计算
          int b = st.top();
          st.pop();
          int a = st.top();
          st.pop();
          switch(e[0])
          {
            case '+':
              st.push(a + b); break;
            case '-':
              st.push(a - b); break;
            case '*':
              st.push(a * b); break;
            case '/':
              st.push(a / b); break;
          }
        }
        else 
        {
          // 如果e是操作数,入栈
          st.push(std::stoi(e.c_str()));
        }
      }
      return st.top();
    }
};

3. 中缀表达式转换成后缀表达式

后缀表达式与中缀表达式的区别就是运算符的位置,转换需要调整运算符优先级

思路:

在这里插入图片描述


例如:a + b * (c - d / e) + f

重点是若字符是操作符或者括号时候的处理

  • 操作数a直接输出。接着+,此时栈空,+入栈。

在这里插入图片描述

  • 操作数b直接输出。接着*, *优先级比+要高,*入栈。

    在这里插入图片描述

  • 左括号递归进行转换后缀表达式,建立一个新的栈空间。栈空,-入栈

    在这里插入图片描述

  • 操作数d直接输出。/优先级比-高,入栈。
    在这里插入图片描述

  • 操作数e直接输出。遇到),将栈内所有运算符依次出栈,得到结果

    在这里插入图片描述

  • 该结果接到递归的上一层结果后

    在这里插入图片描述

  • +号比栈顶元素*优先级低,*出栈输出。+继续与栈顶元素+进行比较,相等仍然需要栈顶元素出栈输出。

    在这里插入图片描述

  • 操作数f直接输出。遍历到中缀表达式结尾,栈内元素依次出栈输出。

在这里插入图片描述

最后得到结果:a + b * (c - d / e) + f–>a b c d e / - * f +


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

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

相关文章

Proxmox VE 实现批量增加多网络

前言 实现批量创建多网络&#xff0c;更改主机名称&#xff0c;hosts解析 初始化网卡&#xff0c;主机名称&#xff0c;hosts解析&#xff0c;重启网卡 我的主机六个网卡&#xff0c;使用的有四个网卡&#xff0c;以下一键创建和初始化主机名称我是以硬件的SN号最为主机的名…

大数据、数据架构、推荐冷启动...小红书的 AI 数据新方案都在这个会

伴随着行业数据持续积累&#xff0c;人工智能正加速渗透各类场景&#xff0c;大数据、数据架构和推荐系统等领域&#xff0c;依然是各行各业目之所聚。4 月 19 至 20 日&#xff0c;「DataFunCon 2024 上海站」来袭&#xff01;大会以“数聚垂域&#xff0c;智领未来”为主题…

超100万用户,迅速登顶 GitHub!运行在浏览器中的开源桌面操作系统,不到一个月拿下 10k star【文末福利】

Puter 是近日在 GitHub 上最受欢迎的一款开源项目&#xff0c;正式开源还没到一个月 ——star 数就已接近 10.1k。 作者表示这个项目已开发 3 年&#xff0c;并获得了超过 100 万用户。 Puter介绍 根据介绍&#xff0c;Puter 是基于 Web 的桌面操作系统&#xff0c;运行于浏览…

数据结构——栈(C++实现)

数据结构——栈 什么是栈栈的实现顺序栈的实现链栈的实现 今天我们来看一个新的数据结构——栈。 什么是栈 栈是一种基础且重要的数据结构&#xff0c;它在计算机科学和编程中扮演着核心角色。栈的名称源于现实生活中的概念&#xff0c;如一叠书或一摞盘子&#xff0c;新添加…

贝锐蒲公英企业路由器X5 Pro:无需专线和IT人员,分钟级异地组网

尽管我们公司规模较小&#xff0c;只有十几个人&#xff0c;但为了确保项目资料的安全&#xff0c;依旧在公司内部自建了文件存储服务器和办公系统。 但是&#xff0c;随着项目数量的增加&#xff0c;大家出差办公的情况也愈发普遍&#xff0c;如何解决远程访问内部系统成了问…

AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 轻松文生视频

AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 &#x1f4fa;轻松文生视频 学习前言源码下载地址技术原理储备&#xff08;DIT/Lora/Motion Module&#xff09;什么是Diffusion Transformer (DiT)LoraMotion Module EasyAnimate简介EasyAnimate原理界面展示快速启动云…

《中医临床诊疗术语》数据库

最新版的《中医临床诊疗术语》于2023年3月17日由国家中医药管理局提出的&#xff0c;由国家市场监督管理总局和国家标准化管理委员会共同发布。新版的修订是为落实相关政策文件要求&#xff0c;推进中医医疗服务规范化、标准化管理&#xff0c;提高中医医疗服务标准化水平和管理…

Web前端开发——Ajax,Axios概述及在Vue框架中的使用

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! Ajax Ajax是什么&#xff1f; Ajax全称Asynchromous JavaScript And Xml&#xff0c;是异步的JavaScript和Xml。 Ajax的作用&#xff1f; 1&#xff0c;数据交换&#xff1a;通过Ajax可以给服务器…

【Redis 神秘大陆】003 数据类型使用场景

三、Redis 数据类型和使用场景 Hash&#xff1a;对象类型的数据&#xff0c;购物车List&#xff1a;队列/栈Set&#xff1a;String类型的无序集合&#xff0c;intset&#xff0c;抽奖、签到、打卡&#xff0c;商品评价标签Sorted Set&#xff1a;存储有序的元素&#xff0c;zip…

二叉树的先中后序遍历

什么是遍历呢&#xff1f; 遍历:按照某种次序把所有结点都访问一遍 先/中/后序遍历:基于树的递归特性确定的次序规则 二叉树的递归特性: ①要么是个空二叉树 ②要么就是由“根节点左子树右子树”组成的二叉树 先序遍历:根左右&#xff08;NLR) ——先访问根结点&#xff0c;…

抖音小店新店铺起飞式玩法,这几步一定要做好,前期很重要

大家好&#xff0c;我是电商笨笨熊 进入抖音小店后不知道该怎么操作&#xff0c;不清楚如何让新店快速起店&#xff1b; 今天我们就来聊聊新店铺快速起店的几个关键步骤&#xff0c;新手玩家一定要按照流程去做。 第一步&#xff1a;店铺搭建 小店开通之后不要着急选品上架&…

FreeRTOS_day1

1.总结keil5下载代码和编译代码需要注意的事项 下载代码前要对仿真进行设置 勾选后代码会立刻执行 勾选后会导致代码不能执行 写代码的时候要写在对应的begin和end之间&#xff0c;否则会被覆盖 2.总结STM32Cubemx的使用方法和需要注意的事项 ①打开软件&#xff0c;新建工程…

项目7-音乐播放器2(上传音乐+查询音乐+拦截器)

0.加入拦截器 之后就不用对用户是否登录进行判断了 0.1 定义拦截器 0.2 注册拦截器 生效 1.上传音乐的接口设计 请求&#xff1a; { post, /music/upload {singer&#xff0c;MultipartFile file}&#xff0c; } 响应&#xff1a; { "status": 0, "message&…

【Android】Activity task和Instrumentation杂谈

文章目录 activity taskInstrumentation机制参考 Android不仅可以装载众多的系统组件&#xff0c;还可以将它们跨进程组成ActivityTask&#xff0c;这个特性使得每个应用都不是孤立的。 activity task 从数据结构角度看&#xff0c;Task有先后之分&#xff0c;源码实现上采取了…

AI人工智能老师大模型讲师叶梓 OneLLM:开创性的多模态大型语言模型技术

在人工智能领域&#xff0c;多模态大型语言模型&#xff08;MLLM&#xff09;的研究一直是一个热门话题。近期&#xff0c;一种名为OneLLM的创新技术引起了业界的广泛关注。OneLLM通过其独特的统一框架&#xff0c;实现了多种不同模态与自然语言的高效对齐&#xff0c;为多模态…

加拿大银行入局,强化数字货币的量子安全防护

领先的量子网络安全公司EvolutionQ此前宣布与加拿大银行签订合同&#xff0c;为加拿大银行的一个研究项目做出贡献&#xff0c;该项目涉及绿地数字货币的量子安全网络安全技术。这项工作强调了EvolutionQ致力于理解量子计算机对新兴金融技术&#xff08;如数字货币&#xff09;…

社区养老服务系统|基于springboot社区养老服务系统设计与实现(源码+数据库+文档)

社区养老服务系统目录 目录 基于springboot社区养老服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员部分功能 &#xff08;1&#xff09; 用户管理 &#xff08;2&#xff09;服务种类管理 &#xff08;3&#xff09;社区服务管理 &#xff08…

怎样编写测试团队通用的JMeter脚本

1、确定测试目标和场景&#xff1a; 与团队成员共同明确测试的目标&#xff0c;例如性能评估、负载测试、稳定性测试等。 确定要测试的具体业务场景和使用案例&#xff0c;比如用户登录、搜索功能、购物流程等。 2、学习 JMeter 工具和基础知识&#xff1a; 阅读 JMeter 官…

JS -a标签和this在DOM的使用、使用DOM完成点击按钮操作div块和获取div块的CSS样式

a标签的索引问题和this <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…

QT 串口助手 学习制作记录

QT 串口助手qt 学习制作记录 参考教程&#xff1a;​​​​​​QT初体验&#xff1a;手把手带你写一个自己的串口助手_qt设计串口助手的流程图-CSDN博客 Qt之串口编程&#xff08;添加QSerialPort模块&#xff09;_如何安装 qt串口模块教程-CSDN博客 串口调试助手&#xff1…