//static void Main(string[] args)
        //{
        //	//Console.WriteLine(Compute("2-6-7*8/2+5"));
        //	Console.WriteLine(Compute("2*3+5/6*3+15"));

        //}

        static double Compute(string expr)
        {
            var numStack = new Utils.Stack <double>();
            var opStack  = new Utils.Stack <char>();

            for (int i = 0; i < expr.Length; i++)
            {
                var value = findNextNumber(expr, i);
                numStack.Push(value);

                i += value.ToString().Length;

                if (i >= expr.Length)
                {
                    break;
                }

                collapseOp(numStack, opStack, expr[i]);
                opStack.Push(expr[i]);
            }

            if (opStack.Count() == 1 && numStack.Count() == 2)
            {
                collapseOp(numStack, opStack, opStack.Peek());
            }

            if (numStack.Count() == 1)
            {
                return(numStack.Pop());
            }

            throw new InvalidOperationException();
        }
        public static void usingStack(SinglyLinkedListNode <int> node)
        {
            var stck = new Utils.Stack <int>();

            while (node != null)
            {
                stck.Push(node.Data);
                node = node.Next;
            }

            while (!stck.IsEmpty())
            {
                Console.WriteLine(stck.Pop());
            }
        }
 static void collapseOp(Utils.Stack <double> numStacks, Utils.Stack <char> opStack, char currentOp)
 {
     while (numStacks.Count() >= 2 && opStack.Count() >= 1)
     {
         if (OpPriority(currentOp) <= OpPriority(opStack.Peek()))
         {
             var num2   = numStacks.Pop();
             var num1   = numStacks.Pop();
             var op     = opStack.Pop();
             var result = applyOp(num1, num2, op);
             numStacks.Push(result);
         }
         else
         {
             break;
         }
     }
 }