Люди добрые,писал на Яве.прошу уделить несколько минут.Все работает как надо.не учитывая структуру данных(Стек не учитываю в данном коде)..очень ли запутанный код?или явно тут видно что не правильно?что тут лишнее, можно по короче, и т.д.
Спасибо всем за любую критику
Код:
import java.util.*;
public class Calc
{
// (15+25)+((-15+25)+5)+(-5--5+5*2/-2.5) +приоритет соблюдается
public static String calc(String a, String b, String operator){
switch (operator) {
case "+": return Double.valueOf(a) + Double.valueOf(b)+"";
case "~": return Double.valueOf(a) - Double.valueOf(b)+"";
case "*": return Double.valueOf(a) * Double.valueOf(b)+"";
case "/": return Double.valueOf(a) / Double.valueOf(b)+"";
}
return null;
}
//чтобы отличать знак "-" от оператора "-", заменяю оператор на тильду.
public static String minustotild(String s){
String result = ""+s.charAt(0);
for (int i = 1; i < s.length(); i++){
if ((s.charAt(i) == '-') && ("+-*(/~".indexOf(s.charAt(i-1)) == -1)) // если предыдущий символ не является оператором то меняем на тильду..
result += ""+'~';
else result +=""+s.charAt(i);
}
return result;
}
public static String operate(String expression){
String num[]; int index = -1;
Character priorityOperator='/'; // default
String operators;
while (!(( operators = expression.replaceAll("[^*+/~]","") ).isEmpty())) // пока имеються операторы
{
if ( (index = operators.indexOf('/')) == -1){ // выбираем приоритетный оператор..
priorityOperator = '*';
if ( (index = operators.indexOf('*')) == -1){
priorityOperator=operators.charAt(0);
index = operators.indexOf(priorityOperator);
}
}
num = expression.split("[^0-9\\-.]"); // сплитим все числа..
// заменяем строкое представление арифметики,на строковой результат с помощью калк().
expression=expression.replaceFirst(num[index]+"\\"+priorityOperator+num[index+1], calc(num[index],num[index+1],""+priorityOperator));
}
return expression;
}
public static String operateBracket(StringBuilder s, int startIndex){
// ''
// 3+4+(4+(3+3)+5)+(4+)
if (startIndex == -1) { // если скобок нету то оперируем .
return (operate(s.toString()));
}
else {
int k = 1;
for (int i=startIndex+1; i < s.length(); i++){
if (s.charAt(i) == '(')
k++;
else if ((s.charAt(i) == ')'))
{
if (k == 1) { // нашли конец первой скобки. не знаю как лучше сделать)
String newBracket = s.substring(startIndex+1, i);
s=s.replace(startIndex,i+1,operateBracket(new StringBuilder(newBracket), newBracket.indexOf(""+'(')));
}
k--;
}
}
}
return operate(s.toString());
}
public static void main(String[] args){
Scanner s = new Scanner( System.in );
String b = s.next();
do {
StringBuilder a = new StringBuilder(minustotild(b));
System.out.println(" result = "+operateBracket(a,a.indexOf(""+'(')));
} while ( (b = s.next()) != "null");
}
}