思想和网上很多人一样,
就是把表达式字符串expression看作是一个个item组成的值,
item之间是最简单的+ - 关系,
item由一个个factor组成的值,item之间的关系是*/关系,
factor是数字或表达式等基本单位
using System;
namespace 表达式求值算法
{
class Program
{
public static void Main(string[] args)
{
int current = 0;
Console.WriteLine(new Expression("(2+3)*(5+7)+9/3").calculate().ToString("0.00"));
}
}
//先递归实现+-*/等操作
class Expression{
private string exp;
private bool isNum(char ch)
{
return (ch >= '0' && ch <= '9')||(ch=='.');
}
public Expression(string str)
{
exp = str;
}
// + -
public double calculate()
{
return expression_value( ref current);
}
private int current = 0;
private double expression_value(ref int current)
{
double result = item_value(ref current);
bool more = true;
while((current < exp.Length)&& more)
{
char op = exp[current];
if (op == '+' || op == '-')
{
current += 1;
double numTemp = item_value(ref current);
if (op == '+')
{
result += numTemp;
}
else if (op == '-')
{
result -= numTemp;
}
}
else
more = false;
}
return result;
}
// * /
private double item_value(ref int current)
{
double result = factor_value(ref current);
bool more = true;
while ((current<exp.Length)&& more)
{
char op = exp[current];
if ( op =='*'||op=='/')
{
current += 1;
double numTemp = factor_value(ref current);
if (op == '*')
{
result *= numTemp;
}
else if (op== '/')
{
result /= numTemp;
}
}
else
more = false;
}
return result;
}
//判断是不是(,再一次调用exprssion_value()
private double factor_value(ref int current)
{
double result = 0;
if (current < exp.Length)
{
char opt = exp[current];
if (opt == '(')
{
current += 1;
result = expression_value(ref current);
current += 1;//去掉)符号
}
else
{
string numTemp = opt.ToString();
current += 1;
while ( (current <exp.Length) && isNum(exp[current]))//后面还有数
{
numTemp += exp[current];
current += 1;
}
result = double.Parse(numTemp);
}
}
return result;
}
}
}