• nyoj 305 表达式求值 (递归)


    表达式求值

    时间限制: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
     1 /**
     2     分析:这个题,用递归(栈)的思想来解决 
     3     
     4     步骤:
     5         ①、遇到 add (A, B)   return A + B;
     6         ②、遇到 max (A, B)   return max (A, B);
     7         ③、遇到 min (A, B)   return min (A, B);
     8     
     9     通过例子 min (add (1, 4), 4) 说明算法执行流程:
    10         ①、将min (add (1, 4), 4) 视为 min (A, B)   return min (A, B);
    11         ②、A = add (1, 4)   return  1 + 4;  (此时:A = 5)
    12         ③、return min (5, 4)    (所以:就得到了答案 ==>  4)
    13         
    14     关键代码:
    15         solve () {
    16             switch (s [pos]) {
    17                 case 'm':
    18                     pos += 4;
    19                     if (s [pos - 2] == 'n')
    20                         return min (solve (), solve ());
    21                     else
    22                         return max (solve (), solve ());
    23                 case 'a':
    24                     return solve () + solve ();
    25                 case ',':
    26                 case ')':
    27                     pos ++;
    28                     return solve ();
    29                 default:
    30                     sscanf (s + pos, "%d%n", &v, &n);
    31                     pos += n;
    32                     return v; 
    33             }
    34         } 
    35 **/

    C/C++代码实现:

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 char s[305];
     6 
     7 int pos, n, v;
     8 
     9 int solve () {
    10     switch (s [pos]) {
    11         case 'm':
    12             pos += 4;
    13             if (s [pos - 2] == 'n')  // min (A, B)
    14                 return min (solve (), solve ());
    15             else   // max (A, B)
    16                 return max (solve (), solve ());
    17         case 'a':   // add (A, B)
    18             pos += 4;
    19             return solve () + solve ();
    20         case ',':
    21         case ')':
    22             pos += 1;
    23             return solve ();
    24         default:
    25             sscanf (s + pos, "%d%n", &v, &n);  
    26             // sscanf ()在这个的作用:对字符串s从pos开始取出第一个整数放在v中,并用n来记录整数的位数 
    27             pos += n;
    28             return v;
    29     }
    30 }
    31 
    32 int main () {
    33     int T;
    34     scanf ("%d", &T);
    35     while (T --) {
    36         pos = 0;
    37         scanf ("%s", &s[0]);
    38         printf ("%d
    ", solve());
    39     }
    40     return 0;
    41 }
  • 相关阅读:
    学习js笔记(第3章-语句和严格模式)
    学习js笔记(1,2章)
    学习闭包
    JavaScript 内存泄漏
    jQuery基础(四)—动画篇
    网站性能优化之yahoo军规
    webpack打包vue文件报错:Module parse failed: Unexpected token (1:0)
    PHP图片转为webp格式
    postman在phpstorm使用xdebug调试
    charles抓取手机APP,配置正确却抓不到数据
  • 原文地址:https://www.cnblogs.com/GetcharZp/p/8980595.html
Copyright © 2020-2023  润新知