[算法] 计算表达式的值

逆方法巴兰 或表达式树会结交新朋友,学习尴尬.
这是你可以阅读理解和应用一个非常简单的方法
简单的表达包括 2 操作 + 和 *
VD: 2*5+3+4*3+2
计算:
如果表达式允许 + 然后在第一个表达 + 表达式最后一节
相反,如果表达式可以允许 * 然后在第一个表达 * 端表达
相反地​​表达=本身的数量

插图: “2*5+3+4*3+2” = “2*5″+”3+4*3+2” = 2 * 5 + 3 +”4*3+2″= 2 * 5 + 3 +”4*3″+2 = 2*5+3+4*3+2
表达式包括算术 +, -, *
在我们的计算中添加表情符号 + 每个标记前 – (如果标 – 当时离开头)
计算方法为正常私自 –
表达式,包括数学 +, -, *, /
更多 + 前 –
更多 * 前 /
虽然数字改变,如果一个错误字符串去除了第一字符串的 - > 继续改变字符串,然后采取逆. 正常进行计算表达式仅 + 和 *

如果您在文章中使用这种算法,你, 请指定算法qvluom的作者的名字

ZIP与说明 4 操作 +, -, *, /

#include <sstream>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <string>
using namespace std;

int check_to_number(string s) //kiem tra la so
{
	int check = 1, l = s.length();
	for (int i = 1; i<l; i++)
		if (!isdigit(s[i]) && s[i] != '.') //duyt tu phan tu thu 2neu khong la so hoac thi check = 0
		{
			check = 0;
			break;
		}
	if (s[0] == '-' && check == 1) return 2; //kiem tra dau xau co la -
	if (s[0] == '/' && check == 1) return 3; //kiem tra  dau xau co la /
	if (isdigit(s[0]) && check == 1) return 1; //dau xau la so
}

float convert_to_number(string s)
{
	float number, check = check_to_number(s);
	if (check > 0)
	{
		if (check == 1)  //neu la so binhf thuong
		{
			stringstream ss (s);
			ss >> number;
		}
		if (check > 1)
		{
			stringstream ss (s.substr(1,s.length()-1));
			ss >> number;
			if (check == 2) number = 0 - number; //neu la phep tru
			if (check == 3) number = 1/number; // neu la phep chia
		}
		return number;
	}
}

float process(string s, int l, int r)
{
	int li = 0, ri = r;
	if (check_to_number(s))  return convert_to_number(s); //{ cout <<"  "<<convert_to_number(s)<<endl; return convert_to_number(s);}
	else
	{
		int i;
		for (i=li; i<ri; i++) if (s[i] == '+') return process(s.substr(li, i-li), li, i) + process(s.substr(i+1, ri-i), i+1, ri-i);
		for (i=li; i<ri; i++) if (s[i] == '*') return process(s.substr(li, i-li), li, i) * process(s.substr(i+1, ri-i), i+1, ri-i);
	}
	return 0;
}

int main()
{
	float number;
	string s;
	getline(cin,s);
	for (int i=0; i<s.length(); i++)
	{
		if(s[i] == '-') { s.insert(i,"+"); i++; }
		if(s[i] == '/') { s.insert(i,"*"); i++; }
	}
	cout<<s<<endl;
	number = process(s,0,s.length());
	cout<<number<<endl;
	return 0;
}