2178 表达式运算Cuties

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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值