ACM,表达式求值、函数表达式求值,ACM表达式求值
来源:互联网 发布:淘宝联盟高佣活动骗局 编辑:程序博客网 时间:2024/06/07 04:33
样例输入:
3
add(1,2)
sub(1,999)
add(min(1,1000),add(100,99))
样例输出:
3
-998
200
-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()同样的获取最外围函数的两个参数,如果获取到的参数是数字,那么就可以直接返回参数的值,如果获取到的参数是函数表达式,将这个函数表达式计算过后将值返回给上一层计算,最后返回到顶层的时候也就是整个表达式的值。通过一层一层的递归调用实现这种表达式的计算。
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
- ACM,表达式求值、函数表达式求值,ACM表达式求值
- ACM--表达式求值实现
- 表达式求值 ACM 数据结构
- 第四届河南省ACM 表达式求值 栈
- nyoj ACM:表达式求值 (堆栈)
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 安卓开发之CheckedBox和RadioGroup
- iOS 9 的新特性
- Android 总结:Manifest文件中,application和activity标签属性详解
- UIStackView
- NYOJ 题目216 A problem is easy【推数学公式】
- ACM,表达式求值、函数表达式求值,ACM表达式求值
- FOJ有奖月赛-2015年11月 Problem B 函数求解
- Insertion Sort List
- Debian的终端界面
- sicily 1007. To and Fro
- 将域名指向子目录
- 用UtralEdit批量删除符合条件的行
- serclet-------Cookie
- TCP三次握手四次挥手