zoukankan      html  css  js  c++  java
  • 表达式求值(二)

     

    表达式求值

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:3
     
    描述

    Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。

    假设表达式可以简单定义为:

    1. 一个正的十进制数 x 是一个表达式。

    2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。

    3. 如果 x 和 y 是 表达式,则 函数max(x,y )也是表达式,其值为x,y 中的最大数。

    4.如果 x 和 y 是 表达式,则 函数add(x,y )也是表达式,其值为x,y 之和。

    例如, 表达式 max(add(1,2),7) 的值为 7。

    请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。

     
    输入
    第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)
    接下来有N行, 每行是一个字符串,表示待求值的表达式
    (表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不
    超过1000。)
    输出
    输出有N行,每一行对应一个表达式的值。
    样例输入
    3
    add(1,2) 
    max(1,999) 
    add(min(1,1000),add(100,99)) 
    
    样例输出
    3
    999
    200

    我的: 
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<stack>
    #include<algorithm>

    using namespace std;

    int main()
    {
       int t,a,b,e,ans,i;
       char op;
       char s[303];
      
       scanf("%d",&t);
       while(t--)
       {
         stack<int> s1;
         stack<char> s2; 
         scanf("%s",s);
      //char *p;
      i=0;
        while(i<strlen(s)) 
         {
           switch(s[i])     
           {
             case 'a':  s2.push(s[i+1]);i+=3;;break;
             case 'm':  s2.push(s[i+1]);i+=3;break;
             case ',':  i++;break;
             case '(':  i++;break;
             case ')':  a=s1.top(); s1.pop(); b=s1.top();s1.pop();op=s2.top();s2.pop();
                        switch(op)
                        {
                          case 'i':e=min(a,b);s1.push(e); break;
                          case 'a':e=max(a,b);s1.push(e); break;
                          case 'd':e=a+b; s1.push(e);  break;              
                        }
         i++;
                        break;  
             default  : ans=(s[i]-'0');
                        i++;
                        while(s[i]>='0' && s[i]<='9')
                        {
                           ans=ans*10+(int)(s[i]-'0');
            i++;
                        } 
                        s1.push(ans);
                        break;
           }        
         }
         printf("%d\n",s1.top())  ; 
       }
       return 0; 
    }       

    高手方法;

     
    #include<cstdio>
    #include<iostream>
    using namespace std;
    char str[1000];
    int start;
    int val()
    {
     int v,n;
     switch(str[start])
     {
     case 'm':start+=3;if(str[start-2]=='i') return min(val(),val());else return max(val(),val());
     case 'a':start+=3;return val()+val();
     case ')':
     case '(':
     case ',':++start;return val();
     default:sscanf(str+start,"%d%n",&v,&n);start+=n;return v;
     }
    }
    int main()
    {
     int n;
     scanf("%d",&n);
     while(n--)
     {
      scanf("%s",str);
      start=0;
      printf("%d\n",val());
     }
    }       

  • 相关阅读:
    Web服务器的Socket通信
    Love story
    Excel初探索 - 2008/3
    One Person Game ZOJ Problem Set 3329
    只有程序员才看得懂的情书
    Collecting Bugs_poj2096
    Scout YYF I_poj3744
    hdu 3336 Count the string
    hdu 1669 Jamie's Contact Groups
    poj 1240
  • 原文地址:https://www.cnblogs.com/hpuwangjunling/p/2488877.html
Copyright © 2011-2022 走看看