题目描述 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;
}