Matematiksel Formül Ayrıştırıcısı, Equation and Formula Parser

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);
    }
}

'Matematiksel Formül Ayrıştırıcısı, Equation and Formula Parser' ile ilgili içerikler

Bilimsel makale yazma kılavuzu
Bilimsel makale yazma kılavuzu
Uzay mekiği yakıt tankının genişliğinin neden 1.5 metredir?
Uzay mekiği yakıt tankının genişliğinin neden 1.5 metredir?
Knockout.js teknolojisi nedir, Knockoutjs ne işe yarar?
Knockout.js teknolojisi nedir, Knockoutjs ne işe yarar?