题:写一个方法计算任意一个数学运算表达式字符串,不区分优先级
例:
"9+8*2"=34
"2-8*9+3"=-51
"2*2*2*2*2"=32
"0"=0
//===========================代码 Begin==============================
/// <summary>
/// 传入一个数学运算的表达示字符串不区分优级计算返回其结果
/// </summary>
protected string ComputeMathStr(string exStr)
{
//去除空字符
exStr = Regex.Replace(exStr.Trim(), " *", "");
//匹配字符串是否是以两个数的操作开头
Match ma = Regex.Match(exStr, @"^(-?d+)([+-*/])(d+)");
if (ma.Success)//匹配成功,计算
{
string firstStr = ma.Groups[0].Value.ToString();//获取匹配的字符串:如2+3
int num1 = int.Parse(ma.Groups[1].Value.ToString());//第一个数值
string opr = ma.Groups[2].Value.ToString();//操作符
int num2 = int.Parse(ma.Groups[3].Value.ToString());//第二个数值
string newStr = exStr.Substring(firstStr.Length);//获取后面剩余的字符串
return ComputeMathStr(GetResultByOperator(opr, num1, num2) + newStr);//递归运算其结果,直到不能匹配为止
}
else//匹配失败,直接返回结果
{
return exStr;
}
}
/// <summary>
/// 根据操作符计算两个数的值并返回结果
/// </summary>
protected int GetResultByOperator(string opr,int num1,int num2)
{
switch (opr)
{
case "+":
return num1 + num2;
case "-":
return num1 - num2;
case "*":
return num1 * num2;
case "/":
if (num2 == 0)
{
throw new Exception("尝试除以零!");
}
return num1 / num2;
default:
return 0;
}
}
//===========================代码 End==================================