【求指导】第一次尝试用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拯救世界吧.