当前位置:网站首页>acwing 3302. 表达式求值
acwing 3302. 表达式求值
2022-07-04 19:13:00 【_刘小雨】
给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。
注意:
数据保证给定的表达式合法。
题目保证符号 - 只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)*(-(1+1)+2) 之类表达式均不会出现。
题目保证表达式中所有数字均为正整数。
题目保证表达式在中间计算过程以及结果中,均不超过 231−1。
题目中的整除是指向 0 取整,也就是说对于大于 0 的结果向下取整,例如 5/3=1,对于小于 0 的结果向上取整,例如 5/(1−4)=−1。
C++和Java中的整除默认是向零取整;Python中的整除//默认向下取整,因此Python的eval()函数中的整除也是向下取整,在本题中不能直接使用。
输入格式
共一行,为给定表达式。
输出格式
共一行,为表达式的结果。
数据范围
表达式的长度不超过 105。
输入样例:
(2+2)*(1+1)
输出样例:
8
关键:
需要用两个栈, 一个栈用于保存数字,另一个需要保存操作运算符
#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>
#include <unordered_map>
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 x;
// 计算
if (c == '+') x = a + b;
else if (c == '-') x = a - b;
else if (c == '*') x = a * b;
else x = a / b;
num.push(x);
}
int main()
{
unordered_map<char, int> pr{
{
'+', 1}, {
'-', 1}, {
'*', 2}, {
'/', 2}}; // 如果有^, 可以直接在后面加 {'^',3}
string str;
cin >> str;
for (int i = 0; i < str.size(); i ++ )
{
auto c = str[i];
if (isdigit(c)) // 数字入栈
{
int x = 0, j = i;
while (j < str.size() && isdigit(str[j]))
x = x * 10 + str[j ++ ] - '0';
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() && op.top() != '(' && pr[op.top()] >= pr[c]) eval(); // 栈里面保存的优先级 >= 当前的优先级
op.push(c);
}
}
while (op.size()) eval();
cout << num.top() << endl;
return 0;
}
边栏推荐
- 实践示例理解js强缓存协商缓存
- Flet教程之 05 OutlinedButton基础入门(教程含源码)
- QT writing the Internet of things management platform 38- multiple database support
- PermissionError: [Errno 13] Permission denied: ‘data.csv‘
- 【深度学习】一文看尽Pytorch之十九种损失函数
- NLP、视觉、芯片...AI重点方向发展几何?青源会展望报告发布[附下载]
- go笔记(3)Go语言fmt包的用法
- Automatic generation of interface automatic test cases by actual operation
- Flet教程之 06 TextButton基础入门(教程含源码)
- JS closure
猜你喜欢
Reinforcement learning - learning notes 2 | value learning
Flet教程之 08 AppBar工具栏基础入门(教程含源码)
Dynamic memory management
Automatic generation of interface automatic test cases by actual operation
AP8022开关电源小家电ACDC芯片离线式开关电源IC
面对同样复杂的测试任务为什么大老很快能梳理解决方案,阿里十年测试工程师道出其中的技巧
工厂从自动化到数字孪生,图扑能干什么?
Fleet tutorial 08 introduction to AppBar toolbar Basics (tutorial includes source code)
Every time I look at the interface documents of my colleagues, I get confused and have a lot of problems...
Flet教程之 05 OutlinedButton基础入门(教程含源码)
随机推荐
电脑共享打印机拒绝访问要怎么办
Flet教程之 04 FilledTonalButton基础入门(教程含源码)
word中插入图片后,图片上方有一空行,且删除后布局变乱
How does win11 search for wireless displays? Win11 method of finding wireless display device
go笔记(1)go语言介绍以及特点
Record the online bug solving list (unfinished to be continued 7/4)
B2B mall system development of electronic components: an example of enabling enterprises to build standardized purchase, sale and inventory processes
Automatic generation of interface automatic test cases by actual operation
二叉树的四种遍历方式以及中序后序、前序中序、前序后序、层序创建二叉树【专为力扣刷题而打造】
什么叫内卷?
What if win11u disk refuses access? An effective solution to win11u disk access denial
jekins初始化密码没有或找不到
What should I do if my computer sharing printer refuses access
Selected review | machine learning technology for Cataract Classification / classification
关于联邦学习和激励的相关概念(1)
语义化标签的优势和块级行内元素
What if the win11 shared file cannot be opened? The solution of win11 shared file cannot be opened
Aiming at the "amnesia" of deep learning, scientists proposed that based on similarity weighted interleaved learning, they can board PNAS
FS4061A升压8.4V充电IC芯片和FS4061B升压12.6V充电IC芯片规格书datasheet
From automation to digital twins, what can Tupo do?