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

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

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. 计算概论(A)/基础编程练习1(8题)/6:判断闰年

    #include<stdio.h> int isLeap(int year) { // 必须先判断是平年的情况 后判断闰年的情况 == && year%!=) || yea ...

  2. P1283 平板涂色

    P1283 平板涂色 dfs 记忆化搜索 将矩阵转化为图求解,然后我们发现这是个DAG,于是就可以愉快地跑搜索了. 进行dfs时,我们可以用类似拓扑排序的方法.每次将上面所有矩形都被刷过(入度in[ ...

  3. P4009 汽车加油行驶问题

    P4009 汽车加油行驶问题 最短路 清一色的spfa....送上一个堆优化Dijkstra吧(貌似代码还挺短) 顺便说一句,堆优化Dj跑分层图灰常好写 #include<iostream> ...

  4. P4824 [USACO15FEB]Censoring (Silver) 审查(银)&&P3121 [USACO15FEB]审查(黄金)Censoring (Gold)

    P3121 [USACO15FEB]审查(黄金)Censoring (Gold) (银的正解是KMP) AC自动机+栈 多字符串匹配--->AC自动机 删除单词的特性--->栈 所以我们先 ...

  5. 重启eclips后启动项目出现监听文件找不到

    重启eclips后启动项目出现监听文件找不到 问题: 重启eclips后启动项目出现Error configuring application listener of class com.thinkg ...

  6. 《课程设计》——foremost的使用

    <课程设计>--foremost的使用 foremost简介 formost 是一个基于文件头和尾部信息以及文件的内建数据结构恢复文件的命令行工具.这个过程通常叫做数据挖掘(data ca ...

  7. 2018-2019-1 20189218《Linux内核原理与分析》第八周作业

    编译链接的过程 编译就是把文本形式源代码翻译为机器语言形式的目标文件过程. 链接是把目标文件.操作系统的启动代码和用到的库文件进行组织最终形成可执行代码的过程. 对于GCC来说,编译源代码并最终形成可 ...

  8. stm32时钟树讲解

    1.管理好时钟,功耗才能更低

  9. C++ 项目中直接使用JsonCpp源码文件

    之前在网上看到使用JsonCpp都是以库的形式使用(编译源码为静态库或者动态库),这样引用很方便,但有时候报错调试看不到错误的地方,所以就想直接把源文件添加到项目中,方便调试 这是用到源码文件: 创建 ...

  10. ArchLinux For Arm 树莓派开机自启动脚本rc.local

    今天折腾了下树莓派的迅雷固件,迅雷的安装很顺利,解压直接运行portal 就搞定了, 但是自启动就有问题了,由于新版的ArchLinux切换到systemd,不但rc.conf省了,连rc.local ...