nyoj1272表达式求值(递归法)

---恢复内容开始---

感冒时写的,简直不忍直视

#include<iostream>
#include<cstring>
using namespace std;
#define LL long long
char s[1010];
LL judp(int,int);
LL judnum(int,int);
LL judc(int,int);
int fin(int st,int ed);
LL all(LL);
LL num(int st,int ed)
{

LL sum=0;

for(int i=st;i<=ed;++i) sum=sum*10+s[i]-‘0‘;

return sum;
}
LL dfs(int st,int ed)
{

int i,j,pp=judp(st,ed),pnum=judnum(st,ed),pc=judc(st,ed);

if(pnum!=-1)        return num(st,ed);

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=fin(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 judp(int a,int b)
{

int i,c=0;

for(i=a;i<=b;++i){

if(s[i]==‘(‘) ++c;

else if(s[i]==‘)‘) --c;

if(s[i]==‘+‘&&c==0) return i;

}

return -1;
}
LL judnum(int st,int ed)
{

int flag=1,i,sum=0;

for(i=st;i<=ed;++i)

{

if(!isdigit(s[i])) return -1;

else sum+=s[i]-‘0‘;

}

return sum;
}
LL judc(int st,int ed)
{

int i,j,c=0;

for(int i=st;i<=ed;++i){

if(s[i]==‘(‘) ++c;

if(s[i]==‘)‘) --c;

if(c==0&&s[i]==‘*‘) return i;}

return  -1;
}
int fin(int a,int b)
{

int c=0;

for(int i=a;i<=b;++i){

if(s[i]==‘(‘) ++c;

if(s[i]==‘)‘) --c;

if(c==1&&s[i]==‘,‘) return i;

}
}
int main()
{

int t;

cin>>t;

while(t--) cin>>s,cout<<dfs(0,strlen(s)-1)<<endl;

return 0;
}

---恢复内容结束---

时间: 2024-10-06 06:41:11

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

NYOJ305 表达式求值(递归or栈)

题目意思: http://acm.nyist.net/JudgeOnline/problem.php?pid=305 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式. 假设表达式可以简单定义为: 1. 一个正的十进制数 x 是一个表达式. 2. 如果 x 和 y 是 表达式,则 函数min(x,y

Diagram Designer 的表达式求值工具(Expression Evaluator)

软件版本:Diagram Designer (Version 1.24) 一.Diagram Designer 的表达式求值工具 下图为 Diagram Designer 的表达式求值工具: 在程序的帮助手册中,对这个表达式求值工具的使用有着较为详细的描述.(在[Using Diagram Designer]的[Expression Evaluator]章节,不过内容是英文的) 里面提到了这个表达式求值工具有下面几个特征(Notable Features): trigonometric func

中缀表达式求值问题

           中缀表达式求值问题 中缀表达式的求值问题是一个比较常见的问题之一,我们通常在编写程序时,直接写出表达式让编译器去处理,很少去关心编译器是怎么对表达式进行求值的,今天我们来一起了解一下其中具体的原理和过程. 表达式一般来说有三种:前缀表达式.中缀表达式.后缀表达式,其中后缀表达式又叫做逆波兰表达式.中缀表达式是最符合人们思维方式的一种表达式,顾名思义,就是操作符在操作数的中间.而前缀表达式和后缀表达式中操作符分别在操作数的前面和操作数的后面.举个例子: 3+2 这个是最简单的

四则运算表达式求值の各种心碎

实验三---四则运算表达式求值 一.基本要求: ( 1 ) 利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值. ( 2) 输入输出格式: 输入格式:在字符界面上输入一个中缀表达式,回车表示结束. 请输入表达式: 输入一个中缀表达式 输出格式:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后 缀表达式中两相邻操作数之间利用空格隔开:如果不正确,在字符界面上输出表达式错误提示. 逆波兰表达式为: 输出逆波兰表达式 运算结果为:输出运算后的结果 测试数据

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

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

栈的两个应用:括号匹配的检验和表达式求值

1.     括号匹配的检验 假设表达式中含有3种括号:(),[],{},其嵌套的顺序随意.检验括号是否匹配. 基本思想:在算法中设置一个栈,每读入一个括号,若是右括号,则或者与栈顶匹配的左括号相互消解,或者是不合法的情况:若是左括号,则直接压入栈中.若括号匹配,在算法的开始和结束时,栈都应该是空的. 代码: /* * 判断表达式中的括号是否匹配,匹配输出Yes,否则输出No * {(zhang)+[lei]+{lei}={zhangleilei}} -> Yes * {(zhang)+[lei

栈的应用——表达式求值

表达式求值是程序设计语言编译中的一个基本问题,它的实现就是对“栈”的典型应用.本文针对表达式求值使用的是最简单直观的算法“算符优先法”. 本文给出两种方式来实现表达式求值,方式一直接利用中缀表达式求值,需要用到两个栈,操作数栈和操作符栈.首先置操作数栈为空栈, 操作符栈仅有“#”一个元素.依次读入表达式中的每个字符,若是操作数则进操作数栈,若是操作符则和操作符栈的栈顶运算符比较优先权作相应操作,直至整个表达式求值完毕.方式二首先把中缀表达式转换为后缀表达式并存储起来,然后利用读出的后缀表达式完成

中缀表达式求值总结

中缀表达式的题目困扰了我两三年,都没去写过..这两天看到2005年提高组的T3要用到所以心血来潮写了一下. 表达式求值借助基本结构应该不用说了是栈,不管手写还是STL都没有太大关系.而中缀表达式最难控制的地方是优先级,算上+-*/^()一共有四个优先级[+-,*/,, ^()](后面会提到一个三级的字符“负号”,这是预留空位). 下面对一个例子进行分析:2*3+4*6/3+17-4^2 那么处理的时候怎么控制优先级呢? 搜到‘+’之前,栈的情况是这样的: 操作数栈:2  3 操作符栈:* 然后搜

栈应用二(表达式求值)

问题;设计一个程序,演示用算符优先法对算术表达式求值的过程.利用算符优先关系,实现对算术四则混合运算表达式的求值.(1)输入的形式:表达式,例如3+2*6-4     包含的运算符只能有'+' .'-' .'*' .'/'(目前还不兼容括号) :(2)输出的形式:运算结果,例如3+2*6-4=11: (3)程序所能达到的功能:对表达式求值并输出:示例:①3+2*6-4 ②30+20*6-80 ③2*7-3*5-3 思路:1.程序扫描表达式,一个一个的扫描2.当发现这个字符是数字的时候,直接入数栈