2178 表达式运算Cuties
来源:互联网 发布:小林聪美 知乎 编辑:程序博客网 时间:2024/06/07 00:01
题目描述 Description
给出一个表达式,其中运算符仅包含+,-,*,/,^要求求出表达式的最终值
数据可能会出现括号情况 还有可能出现多余括号情况
数据保证不会出现>maxlongint的数据
数据可能回出现负数情况
输入描述 Input Description
仅一行,即为表达式
输出描述 Output Description
仅一行,既为表达式算出的结果
样例输入 Sample Input
(2+2)^(1+1)
样例输出 Sample Output
16
分析与代码:Data Size & Hint
表达式总长度<=30
分析与代码: 和 这个的思路一样消左递归,然后解 http://blog.csdn.net/revivedsun/article/details/45082171。
1.该题需要处理的大于9的数字,那么在遇到终结符数字时,循环拼接就可以了。
2.在递归下降的过程中求表达式的值,附加一些属性,及规则即可。这部用到了 属性文法中 综合属性和继承属性的基础知识。继承属性作为参数传递给所调用的函数,当一个产生式结果得到后返回综合属性。这部分知识可参考编译原理相关章节,或http://blog.csdn.net/revivedsun/article/details/45082171 文章末尾所列出的参考资料。
3. 题目输入的表达式都是合法的表达式,因此没给出错误提示信息。
#include <iostream>#include <string>#include <list>#include <cmath>using namespace std;string str; //句子 int i = 0; //读入字符的位置 list<char> postFix; int T(); int E1(int i); int T1(); int T11(int i); int T2(); int T22(int i); int T3(); int E(){ int t1_v = T1(); return E1(t1_v); } int E1(int ci) { int e1_v = ci,e1_i = 0;if(i < str.size() && (str[i] == '+' || str[i] == '-')) { int ti = i; i++; int t1_v = T1(); if (str[ti] == '+') { e1_i = ci + t1_v;postFix.push_back('+'); } else { e1_i = ci - t1_v;postFix.push_back('-'); } e1_v = E1(e1_i); } return e1_v;} int T1() { int t2_v = T2(); int t11_v = T11(t2_v); return t11_v;} int T11(int ci) { int sum = ci;if(i < str.size() && (str[i] == '*' || str[i] == '/')) { int ti = i;int t11_i; i++; int t2_v = T2(); if(str[ti] == '*') { postFix.push_back('*'); t11_i = ci * t2_v;} else if(str[ti] == '/') { postFix.push_back('/'); t11_i = ci / t2_v;} sum = T11(t11_i); } return sum;} int T2(){ int t3_v = T3(); return T22(t3_v); } int T22(int ci) { int sum = ci;if (i < str.size() && str[i] == '^') { i++; int t3_v = T3(); int t22_i = (int)pow(ci*1.0,t3_v*1.0);postFix.push_back('^'); sum = T22(t22_i); } return sum;} int T3() // 终结符 或 () { int t3_v = 0;while (i < str.size() && isalnum(str[i])){t3_v = t3_v * 10 + str[i] - '0';i++;}if(i < str.size() && str[i] == '(') { i++; t3_v = E(); if(str[i] == ')'){ i++; } } return t3_v;} int main() { cin >> str; int result = E(); cout << result;return 0; }
0 0
- 2178 表达式运算Cuties
- CODEVS 2178 表达式运算Cuties
- 【codevs 2178】表达式运算Cuties
- codevs2178 表达式运算Cuties
- 表达式运算
- 表达式运算
- 表达式和运算符
- 数据类型、运算符、表达式
- 运算符和表达式
- 表达式与运算符
- 运算符和表达式
- 三元运算表达式分析
- 运算符、表达式、语句
- 数据类型、运算符、表达式
- 数据类型、运算符、表达式
- 运算符、表达式
- 运算符、表达式、语句
- 运算符和表达式
- ngrok使用小结
- C++实现encodeURI
- Android缓存框架:ACache
- Androidpn客户端调试
- WPF Template模版之DataTemplate与ControlTemplate【一】
- 2178 表达式运算Cuties
- Zookeeper原理
- PHP用socket模拟post之fsocketopen
- mysql的各种查询
- 3D 数据的获取和读入
- C++实现encodeURI 2
- 第六周项目3-人数不定的工资类
- 英文版计算机语言教程的疑难例句备注
- linux下的svn部署