Почти все тесты взяты из комментариев, за что спасибо их составителям. В некоторых случаях мой код выдавал немного другие результаты и тогда я вручную пересчитал выражения из тестов и исправил ожидаемый результат на математически верный. Смущали случаи, когда программа выдаёт результатом -0, я их исправлял, но потом вернул обратно. Валидатор это устраивает. Код из правильного решения иногда выдаёт математически неверный результат. Сначала думал, что придётся как-то подгонять, но оказалось, что если ваша программа будет считать правильно (по ожидаемым результатам из тестов ниже), то такое решение тоже будет принято.
solution.recurse("tan(45)", 0);  System.out.println("1 1 - expected output");
        solution.recurse("tan(-45)", 0);  System.out.println("-1 2 - expected output");
        solution.recurse("1+(1+(1+1)*(1+1))*(1+1)+1", 0);  System.out.println("12 8 - expected output");
        solution.recurse("tan(44+sin(89-cos(180)^2))", 0);  System.out.println("1 6 - expected output");
        solution.recurse("-2+(-2+(-2)-2*(2+2))", 0);  System.out.println("-14 8 - expected output");
        solution.recurse("sin(80+(2+(1+1))*(1+1)+2)", 0);  System.out.println("1 7 - expected output");
        solution.recurse("10-2^(2-1+1)", 0);  System.out.println("6 4 - expected output");
        solution.recurse("2^10+2^(5+5)", 0);  System.out.println("2048 4 - expected output");
        solution.recurse("0.000025+0.000012", 0);  System.out.println("0 1 - expected output");
        solution.recurse("-2-(-2-1-(-2)-(-2)-(-2-2-(-2)-2)-2-2)", 0);  System.out.println("-3 16 - expected output");
        solution.recurse("cos(3 + 19*3)", 0);  System.out.println("0.5 3 - expected output");
        solution.recurse("(-1 + (-2))", 0);  System.out.println("-3 3 - expected output");
        solution.recurse("-sin(2*(-5+1.5*4)+28)", 0);  System.out.println("-0.5 7 - expected output");
        solution.recurse("sin(100)-sin(100)", 0);  System.out.println("0 3 - expected output");
        solution.recurse("-(-22+22*2)", 0);  System.out.println("-22 4 - expected output");
        solution.recurse("(-2)*(-2)", 0);  System.out.println("4 3 - expected output");
        solution.recurse("(-2)/(-2)", 0);  System.out.println("1 3 - expected output");
        solution.recurse("sin(-30)", 0);  System.out.println("-0.5 2 - expected output");
        solution.recurse("cos(-30)", 0);  System.out.println("0.87 2 - expected output");
        solution.recurse("tan(-30)", 0);  System.out.println("-0.58 2 - expected output");
        solution.recurse("2+8*(9/4-1.5)^(1+1)", 0);  System.out.println("6.5 6 - expected output");
        solution.recurse("0+0.304", 0);  System.out.println("0.3 1 - expected output");
        solution.recurse("sin(45) - cos(45)", 0);  System.out.println("0 3 - expected output");
        solution.recurse("0/(-3)", 0);  System.out.println("-0 2 - expected output");
        solution.recurse("1+4/2/2+2^2+2*2-2^(2-1+1)", 0);  System.out.println("6 11 - expected output");
        solution.recurse("0.005", 0);  System.out.println("0.01 0 - expected output");
        solution.recurse("0.0049", 0);  System.out.println("0 0 - expected output");
        solution.recurse("-2^(-2)", 0);  System.out.println("0.25 3 - expected output");
        solution.recurse("-1*-1.00^2",0); System.out.println("-1 4 - expected output");
        solution.recurse("-1*-1.0^2",0); System.out.println("-1 4 - expected output");
        solution.recurse("-1*(-1.00)^2",0); System.out.println("-1 4 - expected output");
        solution.recurse("-(-2^(-2))+2+(-(-2^(-2)))", 0);  System.out.println("1.5 10 - expected output");
        solution.recurse("1.01+(2.02-1+1/0.5*1.02)/0.1+0.25+41.1", 0);  System.out.println("72.96 8 - expected output");
        solution.recurse("2*(589+((2454*0.1548/0.01*(-2+9^2))+((25*123.12+45877*25)+25))-547)", 0);  System.out.println("8302231.36 14 - expected output");
        solution.recurse("0.305", 0);  System.out.println("0.3 0 - expected output");
        solution.recurse("0.3051", 0);  System.out.println("0.31 0 - expected output");
        solution.recurse("(0.3051)", 0);  System.out.println("0.31 0 - expected output");
        solution.recurse("0", 0); System.out.println("0 0 - expected output");
        solution.recurse("(0)", 0); System.out.println("0 0 - expected output");
        solution.recurse("-(0)", 0); System.out.println("-0 1 - expected output");
        solution.recurse("sin(cos(60)*60)*cos(45) * tan(56.25) / ((sin(30+45)+sin(30-45))/(cos(60)*2.0^2.0))", 0);  System.out.println("1.52 17 - expected output");

//        solution.recurse("", 0); // exception
//        solution.recurse("    ", 0); // exception