ACM,表达式求值、函数表达式求值,ACM表达式求值

来源:互联网 发布:淘宝联盟高佣活动骗局 编辑:程序博客网 时间:2024/06/07 04:33

样例输入:

3
add(1,2) 
sub(1,999) 
add(min(1,1000),add(100,99))

样例输出:

3
-998
200

分析解决:

观察函数每一个都是二元函数f(x,y)的形式。我们先解决这种没有嵌套,例如add(x,y)表示的是x+y,这不是蛮简单的吗?但是呢add(x,y)是一个字符串表达式(我们用str来表示),无法直接返回这个x+y的值。于是写两个函数来获取这个表达式的第一个参数和第二个参数的值getexp1(str)和getexp2(str),它们分别返回了这个表达str的1  2个参数的值。于是这个表达式的结果为add=getexp1(str)+getexp2(str)  sub=getexp1(str)-getexp2(str)
下面看代码!
int add(str){    return getexp1(str)+getexp2(str);}
现在解决嵌套问题
add(add(12,13),add(13,14))
观察这种函数嵌套的形式可以很直观的看出这就是一颗二叉树,我们只需要从数的叶子节点一层一层的向上面计算就可以了。我们利用上面的getexp1()和getexp2()同样的获取最外围函数的两个参数,如果获取到的参数是数字,那么就可以直接返回参数的值,如果获取到的参数是函数表达式,将这个函数表达式计算过后将值返回给上一层计算,最后返回到顶层的时候也就是整个表达式的值。通过一层一层的递归调用实现这种表达式的计算。  

下面是代码
源码+测试数据
#include"stdio.h"#include"iostream"#include"fstream"#include"string"#include"stack"#include"algorithm"using namespace std;ifstream fin("input.txt");//声明输入ofstream fout("output.txt");//声明输出int compute(string);//声明函数int getexp1(string);int getexp2(string);int toInt(string);void main(){string str;int n;fin >> n;while (n--){fin>> str;//数据输入fout << compute(str) << endl;}//system("pause");}int compute(string str)//计算表达式{int sum=0;string exp = str.substr(0, 3);if (exp == "add")sum = getexp1(str) + getexp2(str);if (exp == "min"){int x = getexp1(str);int y = getexp2(str);sum = x < y ? x : y;}if (exp == "max"){int x = getexp1(str);int y = getexp2(str);sum = x > y ? x : y;}if (exp == "sub")sum = getexp1(str) -getexp2(str);return sum;}int getexp1(string str)//获取函数的第一个参数(通过堆栈的方式){int sum;int j=0, end;int a[10] = { 0 };stack<char> v;for (int i = 0; i < str.length(); i++){if (str[i] == '('){a[j] = i;j++;v.push(str[i]);}else if (str[i] == ')'){v.pop();j--;}else if (v.size() == 1 && str[i] == ','){end = i;break;}}str = str.substr(a[j-1]+1, end - a[j - 1]-1);//cout << str << "\t";if (str[0] >= '0'&&str[0] <= '9')//如果获取到的参数是数字那么就转换为整数型返回sum=toInt(str);else //如果获取到的参数不是数字,那么就一定是一个函数,在计算出该值然后返回sum = compute(str);return sum;}int getexp2(string str)//获取函数第二个参数{ int sum;int start;int a[10] = { 0 };stack<char> v;for (int i = 0; i < str.length(); i++){if (str[i] == '('){v.push(str[i]);}else if (str[i] == ')'){v.pop();}else if (v.size() == 1 && str[i] == ','){start = i;break;}}str = str.substr(start+1,str.length()-start-2);//cout << str << "\t";if (str[0] >= '0'&&str[0] <= '9')sum = toInt(str);elsesum = compute(str);return sum;}int toInt(string str)//转换为整数{int i, sum=0;for (i = 0; i < str.length(); i++){sum = sum * 10 + (str[i] - '0');}return sum;}


1 0
原创粉丝点击