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
原创粉丝点击