using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ImpExcel
{
public class Calculater
{
/// <summary>
/// 获取表达式计算结果的值
/// </summary>
/// <param name="Exp"> 例:(1 + (2 - 6))* 4 / 6-((1+2)*(3-4))注:-1要用0-1表表示</param>
/// <returns>double 类型的一个值</returns>
public double GetExpVal(string Exp)
{
//(())()
return Convert.ToDouble(GetOutExp(Exp));
}
private string GetOutExp(string Exp)
{
int index = Exp.LastIndexOf("(") + 1;
if (index == 0)
{
return GetInnerExpVal(Exp).ToString();
}
int endIndex = Exp.IndexOf(")", index);
string innerExp = Exp.Substring(index, endIndex - index);
double innerval = GetInnerExpVal(innerExp);
string replacewitval;
if (innerval < 0)
{
replacewitval = "0" + innerval;
}
else
{
replacewitval = innerval + "";
}
Exp = Exp.Replace("(" + innerExp + ")", replacewitval);
return GetOutExp(Exp);
}
/// <summary>
/// 通过加减乘除表达式获取一个值
/// </summary>
/// <param name="Exp">1+2-3*4</param>
/// <returns>值</returns>
public double GetInnerExpVal(string Exp)
{
Stack<string> opStack = new Stack<string>();
Stack<double> numStack = new Stack<double>();
string pattern = @"(-)|(/)|(\+)|(\*)";
string[] parts = Regex.Split(Exp, pattern);
Queue<string> queue = new Queue<string>(parts);
while (true)
{
if (queue.Count == 0)
{
break;
}
string part = queue.Dequeue();
double d = 0.0;
try
{
d = Convert.ToDouble(part.Trim());
numStack.Push(d);
}
catch
{
if (part == "+" || part == "-")
{
opStack.Push(part);
}
else
{
double d1 = numStack.Pop();
double d2 = Convert.ToDouble(queue.Dequeue().Trim());
if (part == "*")
{
numStack.Push(d1 * d2);
}
else if (part == "/")
{
numStack.Push(d1 / d2);
}
}
}
}
while (true)
{
if (numStack.Count == 1)
{
break;
}
double d1 = numStack.Pop();
double d2 = numStack.Pop();
string op = opStack.Pop();
if (op == "+")
{
numStack.Push(d1 + d2);
}
else if (op == "-")
{
numStack.Push(d2 - d1);
}
}
return numStack.Pop();
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ImpExcel
{
public class Calculater
{
/// <summary>
/// 获取表达式计算结果的值
/// </summary>
/// <param name="Exp"> 例:(1 + (2 - 6))* 4 / 6-((1+2)*(3-4))注:-1要用0-1表表示</param>
/// <returns>double 类型的一个值</returns>
public double GetExpVal(string Exp)
{
//(())()
return Convert.ToDouble(GetOutExp(Exp));
}
private string GetOutExp(string Exp)
{
int index = Exp.LastIndexOf("(") + 1;
if (index == 0)
{
return GetInnerExpVal(Exp).ToString();
}
int endIndex = Exp.IndexOf(")", index);
string innerExp = Exp.Substring(index, endIndex - index);
double innerval = GetInnerExpVal(innerExp);
string replacewitval;
if (innerval < 0)
{
replacewitval = "0" + innerval;
}
else
{
replacewitval = innerval + "";
}
Exp = Exp.Replace("(" + innerExp + ")", replacewitval);
return GetOutExp(Exp);
}
/// <summary>
/// 通过加减乘除表达式获取一个值
/// </summary>
/// <param name="Exp">1+2-3*4</param>
/// <returns>值</returns>
public double GetInnerExpVal(string Exp)
{
Stack<string> opStack = new Stack<string>();
Stack<double> numStack = new Stack<double>();
string pattern = @"(-)|(/)|(\+)|(\*)";
string[] parts = Regex.Split(Exp, pattern);
Queue<string> queue = new Queue<string>(parts);
while (true)
{
if (queue.Count == 0)
{
break;
}
string part = queue.Dequeue();
double d = 0.0;
try
{
d = Convert.ToDouble(part.Trim());
numStack.Push(d);
}
catch
{
if (part == "+" || part == "-")
{
opStack.Push(part);
}
else
{
double d1 = numStack.Pop();
double d2 = Convert.ToDouble(queue.Dequeue().Trim());
if (part == "*")
{
numStack.Push(d1 * d2);
}
else if (part == "/")
{
numStack.Push(d1 / d2);
}
}
}
}
while (true)
{
if (numStack.Count == 1)
{
break;
}
double d1 = numStack.Pop();
double d2 = numStack.Pop();
string op = opStack.Pop();
if (op == "+")
{
numStack.Push(d1 + d2);
}
else if (op == "-")
{
numStack.Push(d2 - d1);
}
}
return numStack.Pop();
}
}
}