[アルゴリズム] 式の値を計算します

逆方法バラン または式ツリーを使用すると混乱して初心者になります.
これは読んで理解することですあなたが使用することができ、非常に単純な方法であり、
単純式には、 2 操作 + と *
最高経営責任者(CEO): 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の作者の名前を指定してください

コー​​ドで示され 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;
}