递归写的,类似于之前的一道,但要更难一点,因为加入了'+','*'以及括号运算符,所以要考录周全;

这道题给了我很大启示,在第一道德基础上;

1!寻找括号的优先级,先找有没有不被任何括号夹住的加号,如果有将其两端递归,否则(此时说明没有空出来的加号)继续找有没有没被括号夹住的

‘×’号,如果有将乘号两端继续递归

#include<iostream>
#include<cstring>
using namespace std;
#define LL long long
char s[1010];
LL judnum(int,int);
int judge(int ,int ,char);
LL all(LL);
LL dfs(int st,int ed)
{
int i,j,pp=judge(st,ed,'+'),pnum=judnum(st,ed),pc=judge(st,ed,'*');
   if(pnum!=-1)        return pnum;
   else if(pp!=-1) {LL t1=dfs(st,pp-1),t2=dfs(pp+1,ed);
                        return t1+t2;}

else if (pc!=-1){
    LL t1=dfs(st,pc-1),t2=dfs(pc+1,ed);
    return t1*t2;
}
else if(s[st]=='('&&s[ed]==')') return dfs(st+1,ed-1);
else if(s[st]=='S'){
int mid=judge(st,ed,',');
LL t1=dfs(st+5,mid-1),t2=dfs(mid+1,ed-1);
return max(all(t1),all(t2));
  }
}
LL all(LL a)
{
LL s=0;
while(a){
s+=a%10;
a/=10;}
return s;
}
LL judnum(int st,int ed)
{
int sum=0;
for(int i=st;i<=ed;++i)
{
if(!isdigit(s[i])) return -1;
else sum=sum*10+s[i]-'0';
}
return sum;
}
int judge(int st,int ed,char type)
{
    int c=0,pd=(type==','?1:0);
    for(int i=st;i<=ed;++i){
        if(s[i]=='(') ++c;
        else if(s[i]==')') --c;
        if(c==pd&&s[i]==type) return i;
    }
    return -1;
}
int main()
{
int t;
cin>>t;
while(t--) cin>>s,cout<<dfs(0,strlen(s)-1)<<endl;
return 0;
}

上面那个太傻逼了= =

 #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char str[1005];
int Jud(int l, int r);
int Change(int t);
int main(void)
{
int T, len;
scanf("%d", &T);
while(T--)
{
scanf("%s", str+1);
len = strlen(str+1);
printf("%d\n", Jud(1, len));
}
return 0;
}

int Jud(int l, int r)
{
int i, k;
k = 1;
for(i=l;i<=r;i++)
{
if(str[i]=='(')
k++;
if(str[i]==')')
k--;
if(str[i]=='+' && k==1)
return Jud(l, i-1)+Jud(i+1, r);
}
k = 1;
for(i=l;i<=r;i++)
{
if(str[i]=='(')
k++;
if(str[i]==')')
k--;
if(str[i]=='*' && k==1)
return Jud(l, i-1)*Jud(i+1, r);
}
if(str[l]=='(')
return Jud(l+1, r-1);
if(str[l]>='0' && str[l]<='9')
{
sscanf(str+l, "%d", &k);
return k;
}
k = 1;
for(i=l+5;i<=r-1;i++)
{
if(str[i]=='(')
k++;
if(str[i]==')')
k--;
if(str[i]==',' && k==1)
return max(Change(Jud(l+5, i-1)), Change(Jud(i+1, r-1)));
}
}

int Change(int t)
{
int sum;
sum = 0;
while(t!=0)
{
sum += t%10;
t /= 10;
}
return sum;
}

nyoj1272表达式求值(递归法)的更多相关文章

  1. 栈的一个实例——Dijkstra的双栈算术表达式求值法

    Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) ). 该方法是 使用两个栈分别存储算术表达式的运算符与操作数 忽略左括号 遇到右括 ...

  2. nyoj 305 表达式求值 (递归)

    表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...

  3. 表达式求值(河南省第四届ACM试题-C题)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定指定的一个由3种函数组成的表达式,计算其数值. [题目分析] 一开始以为是后缀表达式,后来抽了没想出来,最后用了递归的方法解 ...

  4. ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)

    题目链接:https://nanti.jisuanke.com/t/31443 相关前置链接 https://www.cnblogs.com/dolphin0520/p/3708602.html ht ...

  5. 【算法】E.W.Dijkstra算术表达式求值

    算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3 ...

  6. lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

    题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...

  7. c/c++ 表达式求值

    表达式求值 [问题描述] 一个算术表达式是由操作数(operand).运算符(operator)和界限符(delimiter)组成的.假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括 ...

  8. Aviator 表达式求值引擎开源框架

    简介¶ Aviator是一个高性能.轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值.现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviato ...

  9. lintcode-424-逆波兰表达式求值

    424-逆波兰表达式求值 求逆波兰表达式的值. 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2" ...

随机推荐

  1. Redis 如何保持和MySQL数据一致【二】

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  2. Python3.x:import urllib2报错解决方案

    Python:import urllib2报错解决方案 python2和3有些不一样: python2:输出为print 'hello world' python3:输出为print('hello w ...

  3. C++设计模式 之 “单一职责”模式:Decorator、Bridge

    part 1 “单一职责”模式 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式 Decorato ...

  4. 05: jQuery

    目录: jQuery参考网站 W3school 1.1 JQuery作用 1.2 jQuery与DOM比较 与 相互转换 1.3 jQuery选择器 1.4 jQuery筛选与过滤 1.5 jQuer ...

  5. 基础知识 - Golang 中的格式化输入输出

    ------------------------------------------------------------ [格式化输出] // 格式化输出:将 arg 列表中的 arg 转换为字符串输 ...

  6. 20145104张家明 《Java程序设计》第四次实验设计

    20145104张家明 <Java程序设计>第四次实验设计 这第四次实验报告 我们开始着手安卓了 在电脑上安装了安卓虚拟机

  7. 20145319 《网络渗透》DNS欺骗

    20145319 <网络渗透>DNS欺骗 实验内容 dns欺骗实质上就是一种通过修改dns文件来改变目标想访问的域名和对应ip的攻击,使得目标在访问自己常用域名时不知不觉落入我们的圈套(可 ...

  8. nmap参数思维导图

    链接:https://pan.baidu.com/s/1vD0A6olQbVNmCCirpHBm0w 提取码:o994

  9. sublimeText3最新教程-自带插件汉化(sublime-text_build-3175_amd64)

    一.可用注册码 1.更改dns 在linux下的目录是     /etc/hosts 在win7中,hosts文件的位置:C:\Windows\System32\drivers\etc 127.0.0 ...

  10. return false break;

    js中的return false;  break; , , , , ]; var list2 = ['a', 'b', 'c', 'd']; ; j < list2.length; j++) { ...