acwing 3302. 表达式求值

​​​​​​给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。

注意:

  • 数据保证给定的表达式合法。
  • 题目保证符号 - 只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)*(-(1+1)+2) 之类表达式均不会出现。
  • 题目保证表达式中所有数字均为正整数。
  • 题目保证表达式在中间计算过程以及结果中,均不超过 2^31−1。
  • 题目中的整除是指向  取整,也就是说对于大于 0 的结果向下取整,例如 5/3=1,对于小于 0 的结果向上取整,例如 5/(1−4)=−1。
  • C++和Java中的整除默认是向零取整;Python中的整除//默认向下取整,因此Python的eval()函数中的整除也是向下取整,在本题中不能直接使用。
输入格式

共一行,为给定表达式。

输出格式

共一行,为表达式的结果。

数据范围

表达式的长度不超过 10^5。

输入样例:
(2+2)*(1+1)
输出样例:
8

代码:双stack + 运算优先级map  

// 双目运算符的模板(若有乘方等双目运算符,则也可扩展eval())
#include <iostream>
#include <stack>
#include <unordered_map> //哈希表
#include <cstring>
using namespace std;stack<int> num; // 数字栈
stack<char> op; // 运算符栈 ( ) + - * /
void eval()
{auto b = num.top();num.pop();auto a = num.top();num.pop();auto c = op.top();op.pop();int ans;if (c == '+')ans = a + b;if (c == '-')ans = a - b;if (c == '*')ans = a * b;if (c == '/')ans = a / b;num.push(ans);
}
int main()
{unordered_map<char, int> pr = {{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};string str;cin >> str;for (int i = 0; i < str.size(); i++){auto c = str[i];if (isdigit(c)){                     // 扫描到数字int x = 0, j = i; // 从j开始搜while (j < str.size() && isdigit(str[j])){ // 读连续数字x = x * 10 + (str[j] - '0');j++;}i = j - 1;num.push(x);}else if (c == '(') // 左括号直接入栈op.push(c);else if (c == ')'){ // 右括号不入栈,遇到直接计算括号内的表达式while (op.top() != '(')eval();op.pop();}else // 扫描到运算符{    // 如果栈顶运算符优先级较高,先操作栈顶元素再入栈while (op.size() && pr[op.top()] >= pr[c])eval();// 如果栈顶运算符优先级较低,直接入栈op.push(c);}}while (op.size()) // 把没有操作完的运算符从右往左操作一遍eval();cout << num.top();return 0;
}

 

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

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

相关文章

java虚拟机的堆核心知识介绍

Java虚拟机&#xff08;JVM&#xff09;的堆&#xff08;Heap&#xff09;是Java内存模型中一个至关重要的部分。它是运行时数据区&#xff0c;用于存储Java对象实例。堆是垃圾收集器工作的地方&#xff0c;也是Java应用程序内存管理的关键区域。在本教程中&#xff0c;我们将深…

nvm安装,nvm使用及常用命令,node版本管理

前端学习交流QQ群&#xff1a;1群&#xff1a;173683895 &#xff0c;2群: 173683866 承接项目开发&#xff0c;需求功能开发&#xff0c;博主微信号&#xff1a;Jay_09168 安装包下载地址 下载使用 安装&#xff1a; 点击 nvm-setup.exe&#xff0c;按下图步骤安装&#…

STM32系列——F103C8T6 控制SG90舵机(HAL库)

文章目录 一、舵机控制原理二、.CubeMX配置配置RCC、SYS、时钟树配置RCC配置SYS配置时钟树配置定时器产生PWM波形 Keil5代码接线图及效果如果您发现文章有错误请与我留言&#xff0c;感谢 一、舵机控制原理 舵机的控制一般需要一个20ms左右的时基脉冲&#xff0c;该脉冲的高电平…

(含链接)2024年NVIDIA GPU技术大会开发者合集(专为开发者挑选的合集)

2024年NVIDIA GPU技术大会开发者合集 我专门为开发者整理了NVIDIA GPU技术大会上专注技术的内容合集, 希望可以帮助开发者朋友们快速了解NVIDIA的最新技术. 注意:在电脑端打开更友好, 可以直接进入每一项的网页 文章目录 2024年NVIDIA GPU技术大会开发者合集如何登录和预约会…

[AutoSar]BSW_Com015 PDUR 模块配置

目录 关键词平台说明一、Abbreviations二、PduRBswModules三、PduRGeneration四、PduRDestPdus4.1 全局PDU ID和本地PDU ID 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编程语言C&#xff0…

react中setState是同步的还是异步的

首先说一下setState是同步的还是异步的&#xff1f; 1.解读 setState 工作流 接下来我们就沿着这个流程&#xff0c;逐个在源码中对号入座。首先是 setState 入口函数&#xff1a; ReactComponent.prototype.setState function (partialState, callback) {this.updater.enqu…

美食制作手记

美食制作手记 文章目录 美食制作手记1. 焖饭系列 1. 焖饭系列 一周五款不重样的电饭煲焖饭&#xff01;妈妈再也不用担心我没好好吃饭了~ 老干妈香菇腊肠焖饭 排骨土豆焖饭 南瓜鸡腿焖饭 番茄牛肉焖饭 羊肉胡萝卜葡萄干焖饭 不定期持续更新…

ThingsBoard初始化数据库Postgres

本章将介绍ThingsBoard的本地环境搭建&#xff0c;以及源码的编译安装。本机环境&#xff1a;centos7&#xff0c;docker,postgres 环境安装 开发环境要求&#xff1a; docker pcentos7 &#xff1b;docker&#xff1b;postgres: 1、使用Docker创建postgres容器化创建 docker…

JS函数知识点(复习)

在 JavaScript&#xff08;JS&#xff09;中使用函数有多种原因&#xff0c;这些原因不仅涉及到代码的组织和可读性&#xff0c;还涉及到代码的可维护性、复用性以及程序的模块化等方面。以下是一些关键的理由&#xff1a; 代码重用&#xff1a;函数允许你将一段代码块封装起来…

(五)消息队列

一、概念 队列又称消息队列&#xff0c;是一种常用于任务间通信的数据结构&#xff0c;队列可以在任务与任务间、中断与任务间传递信息&#xff0c;实现了任务接收来自于其他任务或中断的不定长度信息 二、常用函数 &#xff08;1&#xff09;xQueueCreate创建队列 &#xf…

基于深度学习的唇语识别系统的设计与实现

概要 人工智能作为三大工程之一&#xff0c;从上个世纪至今仍然活跃于各个行业的研究与应用之中&#xff0c;应时代的热潮方向&#xff0c;本 课题主要针对深度学习技术应用于唇语识别当中&#xff0c;实现词语唇语的翻译功能。唇语识别在图像处理中一直是一个富 有挑战性的课题…

C语言基础学习

1 extern 在C语言中&#xff0c;关键字extern用于声明一个变量或函数是在其他文件或模块中定义的。它告诉编译器变量或函数是在其他地方被定义的&#xff0c;而不是在当前文件中。这样做可以使多个文件共享同一个变量或函数&#xff0c;而不需要在每个文件中都重新定义一次。 …

力扣59. 螺旋矩阵 II

思路&#xff1a;此题思路就是绕圈遍历&#xff0c;全靠条件处理技巧&#xff0c;重点要清楚的就是循环不变量&#xff1a;左闭右开&#xff08;即拐弯处的一个数&#xff0c;留给第二行处理&#xff09; 以下是代码随想录的作者的一张图片&#xff0c;每次for循环&#xff0c;…

使用三种方式读取文本文件

文章目录 &#x1f354;需求&#x1f384;思路⭐代码⭐效果&#x1f6f8;注意 在 Java 中&#xff0c;读取文件通常涉及以下几个步骤&#xff1a; 打开文件&#xff1a;首先需要创建一个文件对象&#xff0c;表示要读取的文件。这个文件对象可以包含文件路径、文件名等信息。 …

使用canvas实现图纸标记及回显

图纸 图纸标记后的效果图 最近做的一个qms项目里面&#xff0c;需要前端在图纸上实现标记及标记后的内容还要能够回显&#xff0c;然后后端通过标记的点&#xff0c;去读取标记图纸的内容&#xff0c;如一些公式、数据之类的&#xff0c;目前实现的功能有 在图纸上面进行矩形…

Mysql 索引、锁与MVCC等相关知识点

文章目录 Mysql锁的类型锁使用MVCC快照读和当前读读视图【Read View】串行化的解决 索引类型存储方式区分逻辑区分实际使用区分索引失效情况 索引建立规范SQL编写规范exlpain字段解析ACID的原理日志引擎慢SQL整合SpringBoot博客记录 Mysql锁的类型 MySQL中有哪些锁&#xff1a…

Flutter:构建美观应用的跨平台方案

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

C#理解进程、线程和任务

一、进程、线程和任务 C# 中的进程、线程和任务时&#xff0c;通常涉及到多任务处理、并行编程和异步操作。下面我将详细解释这三个概念&#xff1a; 1.进程 定义&#xff1a;进程是正在运行的程序的实例。每个进程都有自己的内存空间、系统资源和执行状态。C#中的表示&…

【软考】SMTP与SNMP

目录 1. SMTP2. SNMP 1. SMTP 1.简单邮件传输协议&#xff08;Simple Mail Transfer Protocol&#xff09;2.SMTP主要负责底层的邮件系统如何将邮件从一台机器发送至另外一台机器3.该协议工作在TCP协议的25号端口4.小记&#xff1a;Transfer与Transmission都有T 2. SNMP 1.简…

C#创建第一个PIESDK模版的项目

目录 环境配置创建项目方式 环境配置 1软件安装 通过安装光盘或者U盘等介质读取PIE软件的安装程序和使用文档。程序安装过程比较简单&#xff0c;软件本身不借助与任何第三方程序&#xff0c;直接双击安装程序【PIESDK.Net_V6.3_Windows_X64.exe】安装文件&#xff0c;即可安装…