zoukankan      html  css  js  c++  java
  • 表达式求值(河南省第四届ACM试题-C题)题解

    以防万一,题目原文和链接均附在文末。那么先是题目分析:

    【一句话题意】

    给定指定的一个由3种函数组成的表达式,计算其数值。

    【题目分析】

    一开始以为是后缀表达式,后来抽了没想出来,最后用了递归的方法解决问题。不过我还是感觉是考栈的...
    递归的写法大致就是把所有能拆的表达式都拆了执行。而拆法就是..直接把表达式扔给某个函数让它解析吧。哦对了,为了避免传来传去的指针和一堆其他问题,故使用了cpp的string...
    想着想着于是突然想起了x久之前写过的一个gui文件解析器....

    【算法流程】

    主函数就是了,每次都会把指令扔给proc处理。大致会像是这样
    假设一条指令为这样的:add(add(6,1),max(6,1))
    接下来会发生...

    proc("add(add(6,1),max(6,1))")    *1
    proc("add(6,1)")                 *2
    proc("6")                        *3
    proc("1")                        *3
    proc("max(6,1)")                 *2
    proc("6")                        *3
    proc("1")                        *3
    

     就是简单粗暴的递归了,解析一下表达式拆一下接着递归即可。依然不明白的话调试单步执行一次...
     虽然我的方法很蛋疼....

     1 #include <iostream> 
     2 #include <algorithm>
     3 #include <stdio.h>
     4 #include <stdlib.h>
     5 #include <string.h>
     6 #include <math.h>
     7 
     8 #define each(i,n) (int i=1;i<=(n);++i)
     9 
    10 using namespace std;
    11 
    12 bool isInt(char x) {
    13     if (x>='0'&&x<='9') return true;
    14     return false;
    15 }
    16 
    17 int proc(string fvck) {
    18     if (isInt(fvck[0])) {
    19         int x;
    20         sscanf(fvck.c_str(),"%d",&x);
    21         return x;
    22     }
    23     
    24     int kuohao = 0,sLen = fvck.length(),douhao = 0;
    25     string lstr,rstr;
    26     for(int i = 4;i<sLen;i++) {
    27         if (fvck[i]=='(') ++kuohao;
    28         if (fvck[i]==')') --kuohao;
    29         if (fvck[i]==',') {
    30             if (kuohao==0) {
    31                 lstr = fvck.substr(4,i-4);
    32                 douhao = i;
    33                 break;
    34             }
    35         }
    36     }
    37     kuohao = 0;
    38     for(int i = douhao+1;i<sLen;i++) {
    39         if (fvck[i]=='(') ++kuohao;
    40         if (fvck[i]==')') --kuohao;
    41         if (kuohao==-1) {
    42             rstr= fvck.substr(douhao+1,i-douhao-1);
    43             //strncpy(rstr,fvck+douhao+1,i-douhao-1);
    44             break;
    45         }
    46     }
    47     //cout<<"[[[["<<douhao<<" "<<fvck<<" "<<lstr<<" "<<rstr<<endl;
    48     
    49     switch (fvck[1]) {
    50     case 'i':
    51         return min(proc(lstr),proc(rstr));
    52     case 'a':
    53         return max(proc(lstr),proc(rstr));
    54     case 'd':
    55         return proc(lstr)+proc(rstr);
    56     }
    57 }
    58 
    59 int main() {
    60     char buff[361];
    61     int x;
    62     scanf("%d",&x);
    63     while(x--) {
    64         scanf("%s",&buff);
    65         printf("%d
    ",proc(buff));
    66     }
    67 }

    突然发现代码有不怎么和♂谐的变量名字,无视无视无视谢谢


    题目链接表达式求值(可能会失效的链接,如失效建议百度此题目然后找oj提交..)

    题目属性:语言练习(字符串处理和递归..虽说似乎是考栈的)

    题目原文

    【Desc】
    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 之和。
    例如, 表达式 add(max(add(1,2),7) 的值为 7。
    请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。
    【in】第一行:N 表示要计算的表达式个数 (1≤ N ≤ 10)接下来有N行,每行是一个字符串,表示待求值的表达式(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不超过1000。)
    【out】输出有N行,每一行对应一个表达式的值。
    【Samp In】
    3
    add(1,2)
    max(1,999)
    add(min(1,1000),add(100,99))
    【Samp Out】
    3
    999
    200

    表达式求值

  • 相关阅读:
    Two Sum II
    Subarray Sum
    Intersection of Two Arrays
    Reorder List
    Convert Sorted List to Binary Search Tree
    Remove Duplicates from Sorted List II
    Partition List
    Linked List Cycle II
    Sort List
    struts2结果跳转和参数获取
  • 原文地址:https://www.cnblogs.com/blumia/p/HN_4th_ACM_Prob_C.html
Copyright © 2011-2022 走看看