CH1802 表达式计算4
题意
给出一个表达式,其中运算符仅包含+,-,*,/,^(加 减 乘 整除 乘方)要求求出表达式的最终值
数据可能会出现括号情况,还有可能出现多余括号情况
数据保证不会出现>=2^31的答案
数据可能会出现负数情况
表达式总长度<=30
分析
参照机械能战士的题解。
此处不使用栈求表达式值的算法, 而使用递归算法, 注意题目中指出表达式中可能存在多余括号, 因此应首先去除多余括号得到等价的合法表达式(使用栈进行配对即可), 接下来将表达式长度视为问题的规模, 为减小问题的规模实现递归, 根据运算符优先级特点, 如果表达式中存在不在任何括号中的加减号, 那么将最后一个不在任何括号中的加减号作为表达式分割点, 如果存在表达式中存在不在任何括号中的乘除号, 那么将最后一个不在任何括号中的乘除号作为表达式分割点, 否则以最后一个不在任何括号中的乘方号作为表达式的分割点, 下面给出基于此思想AC代码(实际上, 可通过对表达式长度进行数学归纳, 证明下述程序能正确计算表达式的值, 具体证明过程此处不再赘述)
代码
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;
rg char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') w=-1;
ch=getchar();
}
while(isdigit(ch))
data=data*10+ch-'0',ch=getchar();
return data*w;
}
template<class T>il T read(rg T&x){
return x=read<T>();
}
typedef long long ll;
using namespace std;
co int MAX=35,NIL=0x3f3f3f3f;
char cstr[MAX];
list<char> li;
vector<list<char>::iterator> ve;
vector<int> vee;
int getRes(int l,int r){
int x=NIL,y=NIL,z=NIL;
for(int i=l;i<=r;++i){
if(cstr[i]=='(') vee.push_back(i);
else{
if(cstr[i]==')') vee.pop_back();
else{
if((cstr[i]=='+'||cstr[i]=='-')&&vee.empty()) x=i;
else if((cstr[i]=='*'||cstr[i]=='/')&&vee.empty()) y=i;
else if(cstr[i]=='^'&&vee.empty()) z=i;
}
}
}
if(x==NIL&&y==NIL&&z==NIL){
if(cstr[l]=='(') return getRes(l+1,r-1);
int res=0;
for(int i=l;i<=r;++i)
res=res*10+cstr[i]-'0';
return res;
}
if(x!=NIL){
if(cstr[l]=='-') return -getRes(l+1,r);
else return cstr[x]=='+'?getRes(l,x-1)+getRes(x+1,r):getRes(l,x-1)-getRes(x+1,r);
}
if(y!=NIL) return cstr[y]=='*'?getRes(l,y-1)*getRes(y+1,r):getRes(l,y-1)/getRes(y+1,r);
return pow((double)getRes(l,z-1),getRes(z+1,r));
}
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
int len=(scanf("%s",cstr+1),strlen(cstr+1));
for(int i=1;i<=len;++i)
li.push_back(cstr[i]);
for(list<char>::iterator it=li.begin();it!=li.end();++it){
if(*it=='(') ve.push_back(it);
else if(*it==')'&&!ve.empty()) ve.pop_back();
}
for(int i=0;i<ve.size();++i)
li.erase(ve[i]);
copy(li.begin(),li.end(),cstr+1);
len=li.size();
printf("%d\n",getRes(1,len));
return 0;
}
CH1802 表达式计算4的更多相关文章
- .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...
- C# - 二叉树表达式计算
很早以前就写过双栈的表达式计算. 这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作. 感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子. 这样学习印象才深 ...
- C#动态表达式计算
C#动态表达式计算 应该有不少人开发过程中遇到过这样的需求,我们直接看图说话: 如上图所示,其中Entity为实体类,其中包括五个属性,该五个属性的值分别来自于数据库查询结果: 用户通过可视化界面进行 ...
- C#动态表达式计算(续2)
上两篇废话太多,这一次我就不多说了,由于代码比较简单,可以直接从https://github.com/scottshare/DynamicExpress.git地址下载. 以下说明一下使用方法: Dy ...
- 栈应用之 后缀表达式计算 (python 版)
栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1. 中缀表达式.前缀表达式.后缀表达式区别 中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...
- C++实现 逆波兰表达式计算问题
C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack ...
- 算法笔记_044:表达式计算求值(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的 ...
- Fel表达式计算引擎学习
转载原文地址:Fel是轻量级的高效的表达式计算引擎 Fel的问题 Fel的问题 Fel是轻量级的高效的表达式计算引擎 Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是 ...
- 蓝桥杯 算法训练 ALGO-156 表达式计算
算法训练 表达式计算 时间限制:1.0s 内存限制:256.0MB 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输 ...
随机推荐
- winmm.dll获取和设置声音
[DllImport("winmm.dll")] private static extern int waveOutGetVolume(IntPtr hwo, out uint d ...
- 【Demo】jQuery 轮播图简单动画效果
功能实现: (1)设定图片称号的鼠标悬停事件: (2)在事件中利用自定义动画函数调整显示图片,并修改对应标号样式: (3)为图片显示区域设定鼠标悬停事件: (4)当鼠标停在该区域时,清除图片切换动画定 ...
- js中的数据类型和判断数据类型
js中的数据类型和判断数据类型 基本数据类型,六大基本数据类型:字符串(String).数字(Number).布尔(Boolean).对象(Object).空(Null).未定义(Undefined) ...
- vue组件间传值
父传子 1.父组件:在子组件容器内绑定数据 <router-view :unusedOrderNum="num1" :usedOrderNum="num2" ...
- MongoHelper.cs
using System; using MongoDB.Bson; using MongoDB; using System.Web; using MongoDB.Driver; namespace Y ...
- Docker的大坑小洼(二)
再谈<Docker的大坑小洼> 今天闲暇看了一下宏亮同学写的一篇<Docker的大坑小洼>,非常受启发.因为Docker的文章真的很多了,但大家如果只是玩一玩,有很多坑是不会碰 ...
- gitblit-禁用用户
使用管理员账号(此处演示使用admin)登录到系统 右上角,找到用户菜单 再用户列表,找到要进行权限管理的用户,(演示alex) 禁用用户,取消权限 验证已经禁用 pull 权限被禁止
- SpringXML方式配置bean的生命周期lifecycle
在Spring中容器在初始化某个bean的时候会有相应的生命周期,类似于Servlet,有相应的init,destory等方法 例如:如下service 1 2 3 4 5 6 7 8 9 10 11 ...
- IE中在a标签里的图片会显示边框
例如: <a><img src="/UI/Images/ss.jpg"></a>,图的边框会出现a标签默认的边框, 解决办法: img{bord ...
- jQuery 滑动选项卡SmartTab
Smart Tab Overview Smart Tab is a jQuery plugin for tabbed interface. It is flexible and very easy t ...