using System.Collections.Generic;
public static Tuple<char?, int?> FindRoot(string s)
if (s.Length == 0) { return new Tuple<char?, int?>(null,null); }
if (s[0] != '(') { return new Tuple<char?,int?>(null,Int32.Parse(s)); }
Stack<Tuple<char?,int?>> scanned = new Stack<Tuple<char?,int?>>();
for (int i = 0; i < s.Length; i++)
if (s[i] == '(') { numOpenBrackets = numOpenBrackets + 1; }
if (s[i] != ')') { scanned.Push(new Tuple<char?,int?>(s[i], i)) ;}
while (scanned.Peek().Item1 != '(') { scanned.Pop(); }
numOpenBrackets = numOpenBrackets - 1;
return new Tuple<char?, int?>(scanned.Peek().Item1, scanned.Peek().Item2);
public static void Main(string[] args)
Console.WriteLine(FindRoot("(23+(590-(36+7)))"));
Console.WriteLine(FindRoot("((3-98)*(14+7890))"));
Console.WriteLine(FindRoot("((3-98)/(14/7890))"));
Console.WriteLine(FindRoot("((23+(590-(36+7)))*(8765-121))"));