UVALive 2056 Lazy Math Instructor(递归处理嵌套括号)

  因为这个题目说明了优先级的规定,所以可以从左到右直接运算,在处理嵌套括号的时候,可以使用递归的方法,给定每一个括号的左右边界,伪代码如下:

int Cal(){

if(括号)  sum += Cal();

   else sum += num;

  return sum;

}

  但是这个题目着实坑了我一下,见过WA了,没见过TLE呢……我因为没有看到有空格这个条件,无线TLE,又是消除函数又是改用数组模拟栈,其实就是读入出错和忘记了处理空格,改了之后,成功AC了。代码如下:

#include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
#define maxn 100
int pos[maxn],st[maxn];
int Cal(int id,const char *a){
    int sum = 0,tmp;
    for(int i = id+1;i < pos[id];i++){
        if(a[i] == ‘(‘){
            tmp = Cal(i,a);
            if(a[i-1]==‘(‘ || a[i-1]==‘+‘) sum += tmp;
            else if(a[i-1]==‘-‘) sum -= tmp;
            else if(a[i-1]==‘*‘) sum *= tmp;
            i = pos[i];
        }
        else if((a[i]>=‘a‘&&a[i]<=‘z‘)||(a[i]>=‘0‘&&a[i]<=‘9‘)){
            if(a[i]>=‘a‘&&a[i]<=‘z‘) tmp = (a[i]-‘a‘+1);
            else tmp = a[i]-‘0‘;
            if(a[i-1]==‘(‘ || a[i-1]==‘+‘) sum += tmp;
            else if(a[i-1]==‘-‘) sum -= tmp;
            else if(a[i-1]==‘*‘) sum *= tmp;
            i++;
        }
    }
    return sum;
}
int getnum(const char *a){
    memset(pos,0,sizeof(pos));
    memset(st,0,sizeof(st));
    int len = strlen(a);
    int top = 0;
    for(int i = 0;i < len;i++)
    {
        if(a[i]==‘(‘) st[top++] = i;
        if(a[i]==‘)‘) {
            pos[st[--top]] = i;
        }
    }
    int sum = 0,tmp;
    for(int i = 0;i < len;i++){
        if(a[i]==‘(‘){
            tmp = Cal(i,a);
            if(i == 0 || a[i-1]==‘+‘)
            sum += tmp;
            else if(a[i-1] == ‘-‘)  sum -= tmp;
            else if(a[i-1] == ‘*‘)  sum *= tmp;
            i = pos[i];
        }
        else if((a[i]>=‘a‘&&a[i]<=‘z‘)||(a[i]>=‘0‘&&a[i]<=‘9‘)){
            if(a[i]>=‘a‘&&a[i]<=‘z‘) tmp = (a[i]-‘a‘+1);
            else tmp = a[i]-‘0‘;
            if(i == 0 || a[i-1]==‘+‘)
            sum += tmp;
            else if(a[i-1] == ‘-‘)  sum -= tmp;
            else sum *= tmp;
            i++;
        }
    }
    //printf("the num = %d\n",sum);
    return sum;
}
int main()
{
    int t,lena,lenb,num1,num2,tot;
    char a[maxn],b[maxn];
    scanf("%d",&t);
    getchar();
    while(t--){
        gets(a);
        lena = strlen(a);
        tot = 0;
        for(int i = 0;i < lena;i++){
            if(a[i]==‘ ‘) continue;
            else b[tot++] = a[i];
        }
        b[tot] = ‘\0‘;
        num1 = getnum(b);
        gets(a);
        lena = strlen(a);
        tot = 0;
        for(int i = 0;i < lena;i++){
            if(a[i]==‘ ‘) continue;
            else b[tot++] = a[i];
        }
        b[tot] = ‘\0‘;
        num2 = getnum(b);
        if(num1 == num2) puts("YES");
        else puts("NO");
    }
    return 0;
}
时间: 2024-10-07 06:20:57

UVALive 2056 Lazy Math Instructor(递归处理嵌套括号)的相关文章

POJ 1686 Lazy Math Instructor 栈的应用

Description A math instructor is too lazy to grade a question in the exam papers in which students are supposed to produce a complicated formula for the question asked. Students may write correct answers in different forms which makes grading very ha

Lazy Math Instructor

Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3721   Accepted: 1290 Description A math instructor is too lazy to grade a question in the exam papers in which students are supposed to produce a complicated formula for the question asked

poj 1684 Lazy Math Instructor(字符串)

题目链接:http://poj.org/problem?id=1686 思路分析:该问题为表达式求值问题,对于字母使用浮点数替换即可,因为输入中的数字只能是单个digit. 代码如下: #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <cstdlib> #include <string> using namespace

JavaScript——递归,嵌套和闭包

关于函数创建的三种方式以及递归,嵌套和闭包的概念经常容易搞混. 函数定义的三种方式:1.声明式函数(标准的关键字function+函数名+(参数列表)+{函数主体}) 例如:function functionname(param1,param2,......,paramn) {function statment} 2.匿名式函数(将函数赋予的变量+构造函数Function+(参数)) 例如:var variable=new Function("param1","param2&

java获取递归获取嵌套压缩包(zip和rar)中的所有文件

   作者:张昌昌 为了获取一个压缩包中的文件,而该压缩包里可能又含有压缩包 .文件夹.文件夹里又包含压缩包.文件等各种嵌套的情况,采用广度优先遍历和深度优先遍历的方法解决了此问题. public static List<File> getFilesOfZipAndRar(String zipPath) throws IOException { String destPath = zipPath.substring(0,zipPath.lastIndexOf(".")) +

递归、嵌套for循环、map集合方式实现树形结构菜单列表查询

有时候, 我们需要用到菜单列表,但是怎么样去实现一个菜单列表的编写呢,这是一重要的问题. 比如我们需要编写一个树形结构的菜单,那么我们可以使用JQuery的zTree插件:http://www.treejs.cn/v3/main.php#_zTreeInfo 例如现在需要编写一个这样的菜单列表.那么就可以使用JQuery的zTree插件. 先看一下数据库表结构. CREATE TABLE `permission` ( `id` int(11) NOT NULL AUTO_INCREMENT, `

UVaLive 3357 Pinary (Fib数列+递归)

题意:求第 k 个不含前导 0 和连续 1 的二进制串. 析:1,10,100,101,1000,...很容易发现长度为 i 的二进制串的个数正好就是Fib数列的第 i 个数,因为第 i 个也有子问题,其子问题也就是Fib,这样就可以用递归来解决了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include

UVALive 7431(递推&amp;递归_C题)解题报告

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5453 ----------------------------------------------------------------------------------------------------------------------------------

perl 匹配嵌套括号问题

text: (1+2(123+(888)3)ddf)wwww(sdf(sdfdsf)gggg) Match: 1+2 123+ 888 3 ddf sdf sdfdsf gggg 匹配代码: #!/usr/bin/perl use strict; use warnings; use re 'eval'; my $str= '(1+2(123+(888)3)ddf)wwww(sdf(sdfdsf)gggg)'; my @arr; my $re = qr/(?{local $a=0})(?>(?:(