NC50999 表达式计算4

题目

题目描述

给出一个表达式,其中运算符仅包含+,-,*,/,^(加 减 乘 整除 乘方)要求求出表达式的最终值

数据可能会出现括号情况,还有可能出现多余括号情况

数据保证不会出现 \(\geq 2^{31}\) 的答案

数据可能会出现负数情况

输入描述

仅一行,即为表达式

输出描述

仅一行,既为表达式算出的结果

示例1

输入

(2+2)^(1+1)

输出

16

备注

表达式总长度 \(\leq 30\)

题解

思路

知识点:分治。

按优先级给符号分类,记录每类符号不在括号内的最后一个出现的地方位置,随后找到优先级最低且符号位置存在的位置划分表达式为左右两边,对他们进行相同的操作,然后根据返回表达式值以及对应符号处理得到结果再返回到上一层。

关于匹配括号,引入括号计数器 \(cnt\) 如果为 \(0\) 则说明当前不在任何括号内,只有这时才能够确定符号位置。要注意可能会有多余括号问题,正常情况括号是互相匹配的,而多余的括号会使计数不为 \(0\) 。

在过程中如果遇到 \(cnt < 0\) ,说明中间有多余右括号,这种括号可以直接删除,不影响后面结果,因此这种情况下也可以确定符号位置,当然为了防止 \()(\) 的反向匹配导致优先级混乱,所以每次确定符号都要把 \(cnt\) 归零。如 $(1+3)) * (3+1) $ 的答案是 \(16\) 不归零就会得到 \(13\) 。

在遍历完算式后发现没有符号位置,则说明有最外层括号需要清除或者这个是个纯数字,进一步分类如果 \(cnt = 0\) ,再检查外侧是否有括号,决定是纯数字转化或者对称外层括号清除;如果 \(cnt > 0\) ,则有多余外层左括号清除; \(cnt<0\) ,则有多余外层右括号清除。

如存在位置,从低优先级检查位置,进行运算处理。

时间复杂度 平均:\(O(nlogn)\) 最差: \(O(n^2)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

string s;
int StoI(int l, int r) {
int ans = 0;
for (int i = l;i <= r;i++) ans = ans * 10 + s[i] - '0';
return ans;
} int calc(int l, int r) {
int cnt = 0;///记录括号数量
int pos[3] = { -1,-1,-1 };///分别对应+-,*/,^
for (int i = l;i <= r;i++) {///记录当前子算式不包括在括号内的符号
//())) + ()
if (s[i] == '(') cnt++;
else if (s[i] == ')')cnt--;
else if (cnt <= 0) {///判断符号是否在括号内,<0异常右端括号失配可以直接忽略(记得清空cnt)
cnt = 0;///取消右失配括号对后面的影响,原题数据不行
if (s[i] == '+' || s[i] == '-') pos[0] = i;
else if (s[i] == '*' || s[i] == '/') pos[1] = i;
else if (s[i] == '^') pos[2] = i;
}
}
// ((()+())
// (()+()
if (!~pos[0] && !~pos[1] && !~pos[2]) {///异常括号或者无符号纯数字导致的无括号外符号的处理
if (!cnt) {
if (s[l] == '(') return calc(l + 1, r - 1);///具有对称最外部括号
else return StoI(l, r);///没有括号的纯数字
}
else if (cnt > 0) return calc(l + 1, r);///去掉左括号
else if (cnt < 0) return calc(l, r - 1);///去掉右括号
}
else if (~pos[0]) {
if (s[pos[0]] == '+') return calc(l, pos[0] - 1) + calc(pos[0] + 1, r);
else if (s[pos[0]] == '-') return calc(l, pos[0] - 1) - calc(pos[0] + 1, r);
}
else if (~pos[1]) {
if (s[pos[1]] == '*') return calc(l, pos[1] - 1) * calc(pos[1] + 1, r);
else if (s[pos[1]] == '/') return calc(l, pos[1] - 1) / calc(pos[1] + 1, r);
}
else if (~pos[2]) return pow(calc(l, pos[2] - 1), calc(pos[2] + 1, r));
return 0;///底部返回值,不然过不了编译
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> s;
cout << calc(0, s.length() - 1) << '\n';
return 0;
}

NC50999 表达式计算4的更多相关文章

  1. .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...

  2. C# - 二叉树表达式计算

    很早以前就写过双栈的表达式计算. 这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作. 感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子. 这样学习印象才深 ...

  3. C#动态表达式计算

    C#动态表达式计算 应该有不少人开发过程中遇到过这样的需求,我们直接看图说话: 如上图所示,其中Entity为实体类,其中包括五个属性,该五个属性的值分别来自于数据库查询结果: 用户通过可视化界面进行 ...

  4. C#动态表达式计算(续2)

    上两篇废话太多,这一次我就不多说了,由于代码比较简单,可以直接从https://github.com/scottshare/DynamicExpress.git地址下载. 以下说明一下使用方法: Dy ...

  5. 栈应用之 后缀表达式计算 (python 版)

    栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1.  中缀表达式.前缀表达式.后缀表达式区别  中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...

  6. C++实现 逆波兰表达式计算问题

    C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack ...

  7. 算法笔记_044:表达式计算求值(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的 ...

  8. Fel表达式计算引擎学习

    转载原文地址:Fel是轻量级的高效的表达式计算引擎 Fel的问题 Fel的问题 Fel是轻量级的高效的表达式计算引擎 Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是 ...

  9. 蓝桥杯 算法训练 ALGO-156 表达式计算

    算法训练 表达式计算   时间限制:1.0s   内存限制:256.0MB 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输 ...

随机推荐

  1. javascript生成一棵树

    问题描述 输入一串父子节点对的数组,利用其构造一颗树 输入 const arr = [ {id:1,parentid:null}, {id:2,parentid:1}, {id:3,parentid: ...

  2. 微信小程序绑定函数如何携带参数

    一开始以为微信小程序的语法是和VUE的语法一样的,直接@click="click(field)",结果却不是这样的 在微信小程序中我们需要设置一个 data-set ,然后在绑定的 ...

  3. c++动态内存分配需要注意的地方,可以不用尽量不用

    在实际开发中,需要动态分配内存的场景极少,string和vector已经足够方便,如果不是非用不可的情况,采用动态分配内存就是给自己挖坑. 如果应用开发中一定要用动态内存分配技术,建议把它封装在类中, ...

  4. 脚踏实地的Netty源码研究笔记——开篇

    1. 脚踏实地的Netty源码研究笔记--开篇 1.1. Netty介绍 Netty是一个老牌的高性能网络框架.在众多开源框架中都有它的身影,比如:grpc.dubbo.seata等. 里面有着非常多 ...

  5. 520,用Python定制你的《本草纲目女孩》

    摘要:让我们来用Python定制出心仪的"本草纲目女孩",敲出魔性的代码舞蹈,520,准备好心仪女孩的舞蹈视频,把这份别出心裁的礼物给TA 本文分享自华为云社区<[云驻共创] ...

  6. 145_Power BI Report Server自定义Form登录

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 1.背景 很久没有更新Power BI Report Server了,发现自己机器还是2021年1月版本的,现在更新了20 ...

  7. 110_Power Pivot特殊结算日期及财年日期

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 1.背景 前几天看到群里有朋友在搞特殊结算日期,主要不是按照正常日期里的整月,按照比如:上月21号至本月20号作为结算周期 ...

  8. Hadoop常见shell命令

    Hadoop中常见的shell命令 1.如何将Linux本地的数据上传到HDFS中? hadoop fs -put 本地的文件 HDFS中的目录hdfs dfs -put 本地的文件 HDFS中的目录 ...

  9. 向sqlserver 数据库插入emoji 表情包

    1.emoji 属于特殊字符 所以我们必须使用utf-8 的编码格式进行保存  不过好在sqlserver 默认支持utf-8 2.将需要存储emoji的字段必须设置为nvarchar 类型  因为v ...

  10. ACM 刷题记录

    HDU Multi-University Training Contest 题目来源 题目 知识点 时间复杂度 完成情况 2019 Contest8 A Acesrc and Cube Hyperne ...