Matematiksel Formül Ayrıştırıcısı, Equation and Formula Parser
Bu sayfada Ahmed Yasin Koçulu'nun hazırladığı "Matematiksel Formül Ayrıştırıcısı" nın kodlarını bulabilirsiniz.
void Main()
{
string input = "2-(3*(2-7)+4+5)*7";
System.Console.WriteLine(input + " = " + Calculate(input));
}
double Calculate(string input)
{
var list = Regex.Split(input, "([+*-/()])").Where(x => !string.IsNullOrWhiteSpace(x));
double result = 0;
Stack<double> numStack = new Stack<double>();
Stack<string> opStack = new Stack<string>();
bool fetchNumber = true;
foreach(var m in list)
{
if(m == "(")
{
opStack.Push(m);
}
else if(m == ")")
{
Walk(numStack, opStack, true);
}
else
{
if(fetchNumber)
{
double number = double.Parse(m.Trim());
numStack.Push(number);
}
else
{
if(m == "+" || m == "-")
Walk(numStack, opStack);
opStack.Push(m);
}
fetchNumber = !fetchNumber;
}
}
Walk(numStack, opStack);
result = numStack.Pop();
return result;
}
void Walk(Stack<double> numStack, Stack<string> opStack, bool close = false)
{
while(opStack.Count > 0 && numStack.Count > 1)
{
if(opStack.Peek() == "(")
{
if(close)
opStack.Pop();
break;
}
string operation = opStack.Pop();
double d2 = numStack.Pop();
double d1 = numStack.Pop();
double z1 = 0;
switch(operation)
{
case "+": z1 = d1 + d2; break;
case "-": z1 = d1 - d2; break;
case "*": z1 = d1 * d2; break;
case "/": z1 = d1 / d2; break;
}
numStack.Push(z1);
}
}