首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

【求指导】第一次尝试用STL,该如何处理

2012-05-09 
【求指导】第一次尝试用STL题目是这样的:Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简

【求指导】第一次尝试用STL
题目是这样的:

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

C/C++ code
#include <iostream>#include <stack>#include <cstring>using namespace std;int min(int x, int y) { return (x < y ? x : y); }int max(int x, int y) { return (x > y ? x : y); }int add(int x, int y) { return (x + y); }int Evaluate(char *str);int main(){    char str[10][301];    int n, i;    scanf("%d", &n);    for (i = 0; i < n; ++i)        scanf("%300s", str[i]);    for (i = 0; i < n; ++i)        printf("%d\n", Evaluate(str[i]));    return 0;}int Evaluate(char *str){    char *p;    int value1, value2, result;  // 操作数、运算结果    char ch;  // 运算符    char fun[4];  // 函数名    stack<int> Number;  // 操作数栈    stack<char> Operator;  // 运算符栈    stack<int (*)(int, int)> Function;  // 函数栈    char buf[5];    p = str;    while (*p != '\0')    {        if (*p >= '0' && *p <= '9')  // 数字        {            sscanf(p, "%d", &value1);  // 解析数字            p += sprintf(buf, "%d", value1); // 移动指针            if (Operator.empty())  // 运算符栈为空            {                Number.push(value1);  // 操作数进栈            }            else  // 运算符栈不为空            {                ch = Operator.top();  // 取运算符                if (ch == '+' || ch == '-')  // 加号/减号                {                    Operator.pop();                    if (Number.empty())  // 操作数栈为空                    {                        value2 = 0;                    }                    else  // 操作数栈不为空                    {                        value2 = Number.top();  // 取操作数                        Number.pop();                    }                    // 加减法运算,结果进栈                    if (ch == '+')                        Number.push(value2 + value1);                    else                        Number.push(value2 - value1);                }                else  // 左括号                {                    Number.push(value1);  // 进操作数栈                }            }        }        else if (*p == '+' || *p == '-')        {            Operator.push(*p++);  // 加减号进运算符栈        }        else if (*p == ',')        {            ++p;        }        else if (*p == ')')        {            value1 = Number.top();  // 取操作数1            Number.pop();            value2 = Number.top();  // 取操作数2            Number.pop();            Operator.pop();  // 除去左括号            result = Function.top()(value1, value2);  // 函数计算            Number.push(result);  // 结果进栈            Function.pop();            ++p;        }        else  // 函数名        {            sscanf(p, "%3s", fun);  // 解析函数名            p += 4;            if (strcmp(fun, "min") == 0)                Function.push(&min);            else if (strcmp(fun, "max") == 0)                Function.push(&max);            else                Function.push(&add);            Operator.push('(');  // 左括号进运算符栈        }    }    if (!Operator.empty())    {        value1 = Number.top();  // 取操作数1        Number.pop();        if (Number.empty())  // 操作数栈为空        {            value2 = 0;        }        else  // 操作数栈不为空        {            value2 = Number.top();  // 取操作数2            Number.pop();        }        ch = Operator.top();        Operator.pop();        // 加减法运算,结果进栈        if (ch == '+')            Number.push(value2 + value1);        else            Number.push(value2 - value1);    }    return (Number.top());} 



[解决办法]
只有一个想法:让switch拯救世界吧.

热点排行