Дайте пожалуйста экстра тесты для алгоритма
package com.javarush.task.task34.task3404;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
Рекурсия для мат. выражения
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
solution.recurse("sin(2*(-5+1.5*4)+28)", 0);
solution.recurse("tan(2025 ^ 0.5)", 0);
}
public void recurse(final String expression, int countOperation) {
String string = expression;
char[] chars = string.toCharArray();
int min = 0, min1 = 0;
int stop = 0;
int countOper = countOperation;
for (int i = 0; i < chars.length; i++) {
if(chars[i] == '('){
min = i;
}
if(chars[i] ==')' && stop == 0){
min1 = i;
stop = 1;
}
}
if(min == 0 && min1 == 0){
countOper++;
if(string.startsWith("sin")){
DecimalFormat format = new DecimalFormat();
format.setDecimalSeparatorAlwaysShown(false);
Double d = Math.sin(Double.parseDouble(string.substring(3))* Math.PI / 180);
System.out.println(format.format(d) + " " + countOper);
}
if(string.startsWith("cos")){
DecimalFormat format = new DecimalFormat();
format.setDecimalSeparatorAlwaysShown(false);
Double d = Math.cos(Double.parseDouble(string.substring(3)) * Math.PI / 180);
System.out.println(format.format(d) + " " + countOper);
}
if(string.startsWith("tan")){
DecimalFormat format = new DecimalFormat();
format.setDecimalSeparatorAlwaysShown(false);
Double d = Math.tan(Double.parseDouble(string.substring(3)) * Math.PI / 180);
System.out.println(format.format(d) + " " + countOper);
}
}
else{
String string1 = "";
for (int i = min + 1; i < min1; i++) {
if(!isItNumber(chars[i] + "")){
if (chars[i] != '.' && chars[i] != ' ') {
countOper++;
}
}
string1 = string1 + chars[i];
}
String string2 = calculate(string1);
String generalString = "";
for (int i = 0; i < chars.length; i++) {
if(i == min){
generalString = generalString + string2;
}
else if(i < min || i > min1){
generalString = generalString + chars[i];
}
}
Solution solution = new Solution();
solution.recurse(generalString, countOper);
}
}
public String calculate(String string){
char[] chars = string.toCharArray();
List<String> list = new ArrayList<>();
List<Double> integers = new ArrayList<>();
for (int i = 0; i < chars.length; i++) {
String s = "" + chars[i];
if (isItNumber(s) && !s.equals(" ")) {
while (isItNumber(s) && i < chars.length) {
integers.add(Double.parseDouble(s));
i++;
if (i < chars.length) {
s = "" + chars[i];
}
}
if (s.equals(".")) {
i++;
s = "" + chars[i];
integers.add(1.111);
while (isItNumber(s) && i < chars.length) {
integers.add(Double.parseDouble(s));
i++;
if (i < chars.length) {
s = "" + chars[i];
}
}
list.add(createDouble(integers));
} else {
list.add(createNumber(integers));
}
integers.clear();
i--;
} else if(!s.equals(" ")){
list.add(s);
}
}
double result = 0;
List<String> list1 = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if(list.get(i).equals("-") && i == 0){
list1.add(String.valueOf(Double.parseDouble(list.get(i + 1)) * -1));
i++;
}
else if(list.get(i).equals("-") && isItNumber(list.get(i - 1))){
list1.add("+");
list1.add(String.valueOf(Double.parseDouble(list.get(i + 1)) * -1));
i++;
}
else{
list1.add(list.get(i));
}
}
list.clear();
list.addAll(list1);
list1.clear();
for (int j = 0; j < list.size(); j++) {
if(list.get(j).equals("^")){
list1.add(String.valueOf(Math.pow(Double.parseDouble(list1.get(list1.size() - 1)), Double.parseDouble(list.get(j + 1)))));
list1.remove(list1.size() - 2);
j++;
}
else{
list1.add(list.get(j));
}
}
list.clear();
list.addAll(list1);
list1.clear();
for (int j = 0; j < list.size(); j++) {
if(list.get(j).equals("*")){
list1.add(String.valueOf(Double.parseDouble(list1.get(list1.size() - 1)) * Double.parseDouble(list.get(j + 1))));
list1.remove(list1.size() - 2);
j++;
}
else{
list1.add(list.get(j));
}
}
list.clear();
list.addAll(list1);
list1.clear();
for (int j = 0; j < list.size(); j++) {
if(list.get(j).equals("/")){
list1.add(String.valueOf(Double.parseDouble(list1.get(list1.size() - 1)) / Double.parseDouble(list.get(j + 1))));
list1.remove(list1.size() - 2);
j++;
}
else{
list1.add(list.get(j));
}
}
list.clear();
list.addAll(list1);
list1.clear();
for (int j = 0; j < list.size(); j++) {
if(list.get(j).equals("+")){
list1.add(String.valueOf(Double.parseDouble(list1.get(list1.size() - 1)) + Double.parseDouble(list.get(j + 1))));
list1.remove(list1.size() - 2);
j++;
}
else{
list1.add(list.get(j));
}
}
list.clear();
list.addAll(list1);
list1.clear();
String s = list.get(0);
return s;
}
public String createDouble(List<Double> list){
int i = 0;
String result = "";
while(list.get(i) != 1.111){
result = result + list.get(i).intValue();
i++;
}
result = result + ".";
i++;
while(i < list.size()){
result += list.get(i).intValue();
i++;
}
return result;
}
public String createNumber(List<Double> list){
double n = 0;
if(list.size() == 1){
n = list.get(0);
}
else{
for (int i = list.size() - 1; i >= 0; i--) {
n += list.get(i) * Math.pow(10, list.size() - 1 - i);
}
}
return String.valueOf(n);
}
public boolean isItNumber(String s){
try{
double a = Double.parseDouble(s);
return true;
}
catch (Exception e){
return false;
}
}
public Solution() {
//don't delete
}
}