using System.Collections.Generic;
public static void Main()
string str = "45.0*(6-7+6*(23+2))";
str = "45.0*(6-7+6+9)*(23+2)";
Console.WriteLine(Evaluate(str));
public static double Evaluate(string expr)
Stack<String> stack = new Stack<String>();
for (int i = 0; i < expr.Length; i++)
String s = expr.Substring(i, 1);
char chr = s.ToCharArray()[0];
if (!char.IsDigit(chr) && chr != '.' && value != "")
for (; i < expr.Length; i++)
s = expr.Substring(i, 1);
if (s.Equals("(")) bracketCount++;
if (bracketCount == 0) break;
stack.Push(Evaluate(innerExp).ToString());
else if (s.Equals("+") ||
else if (char.IsDigit(chr) || chr == '.')
if (value.Split('.').Length > 2)
throw new Exception("Invalid decimal.");
if (i == (expr.Length - 1))
throw new Exception("Invalid character.");
List<String> list = stack.ToList<String>();
for (int i = list.Count - 2; i >= 0; i--)
list[i] = (Convert.ToDouble(list[i - 1]) / Convert.ToDouble(list[i + 1])).ToString();
for (int i = list.Count - 2; i >= 0; i--)
list[i] = (Convert.ToDouble(list[i - 1]) * Convert.ToDouble(list[i + 1])).ToString();
for (int i = list.Count - 2; i >= 0; i--)
list[i] = (Convert.ToDouble(list[i - 1]) + Convert.ToDouble(list[i + 1])).ToString();
for (int i = list.Count - 2; i >= 0; i--)
list[i] = (Convert.ToDouble(list[i - 1]) - Convert.ToDouble(list[i + 1])).ToString();
for (int i = 0; i < list.Count; i++)
return Convert.ToDouble(stack.Pop());