2013-04-12 2 views
1

Да! Спасибо за помощь по последнему вопросу! Для указанного строкового уравнения он отлично работал! Но теперь у меня возникают проблемы, когда дело доходит до двух скобок (открыть или закрыть ли) вместеСтроковое уравнение для простых комплексных уравнений (2)

пример: 4+ (2+ (1 + 1))

Где-то в моем коде попадает в ловушку в петля, но я не знаю, где! Что не так? Мой код:

import java.util.ArrayList; 

public class StringEquation 
{ 
    public static void main(String[] args) 
    { 
     String s = "2+(8*(7+1))"; 

     ArrayList<String> equation = new ArrayList<>(); 

     String ns = ""; 

     String b; 

     int nsi = 0; 

     double n; 

     double res; 

     for(int c=0; c<s.length(); c++) 
     { 
      b = s.substring(c,c+1); 
      if("0".equals(b)||"1".equals(b)||"2".equals(b)||"3".equals(b)||"4".equals(b)||"5".equals(b)||"6".equals(b)||"7".equals(b)||"8".equals(b)||"9".equals(b)) 
      { 
       ns += b; 
       if(c==s.length()-1) 
       { 
        nsi = Integer.parseInt(ns); 
        equation.add(Integer.toString(nsi)); 
       } 
      } 
      else if(("+".equals(b)||"-".equals(b)||"*".equals(b)||"/".equals(b)||"%".equals(b))&&!"".equals(ns)) 
      { 
       nsi = Integer.parseInt(ns); 
       equation.add(Integer.toString(nsi)); 
       equation.add(b); 
       ns = ""; 
      } 
      else if("(".equals(b)) 
      { 
       equation.add(b); 
      } 
      else if (")".equals(b)) 
      { 
       if(!"".equals(ns)) 
       { 
        nsi = Integer.parseInt(ns); 
       } 
       equation.add(Integer.toString(nsi)); 
       equation.add(b); 
       ns = ""; 
      } 
      else if("+".equals(b)||"-".equals(b)||"*".equals(b)||"/".equals(b)||"%".equals(b)) 
      { 
       equation.add(b); 
      } 
     } 

     while(equation.contains("(")||equation.contains(")")) 
     { 
      for(int d=0; d<equation.size(); d++) 
      { 
       if("*".equals(equation.get(d))||"/".equals(equation.get(d))||"%".equals(equation.get(d))) 
       { 
        if("(".equals(equation.get(d-1))||")".equals(equation.get(d-1))||"(".equals(equation.get(d+1))||")".equals(equation.get(d+1))) 
        { 
         switch(equation.get(d)) 
         { 
          case "*": equation.set(d, "TIMES"); break; 
          case "/": equation.set(d, "DIVBY"); break; 
          default: equation.set(d, "MOD"); 
         } 
        } 
        else 
        { 
         switch(equation.get(d)) 
         { 
          case "*": 
           n = Double.parseDouble(equation.get(d-1)); 
           n *= Double.parseDouble(equation.get(d+1)); 
           equation.set(d-1, Double.toString(n)); 
           equation.remove(d); 
           equation.remove(d); 
           break; 
          case "/": 
           n = Double.parseDouble(equation.get(d-1)); 
           n /= Double.parseDouble(equation.get(d+1)); 
           equation.set(d-1, Double.toString(n)); 
           equation.remove(d); 
           equation.remove(d); 
           break; 
          default: 
           n = Double.parseDouble(equation.get(d-1)); 
           n %= Double.parseDouble(equation.get(d+1)); 
           equation.set(d-1, Double.toString(n)); 
           equation.remove(d); 
           equation.remove(d); 
         } 
        } 
       } 
      } 

      for(int d=0; d<equation.size(); d++) 
      { 
       if("+".equals(equation.get(d))||"-".equals(equation.get(d))) 
       { 
        if("(".equals(equation.get(d-1))||")".equals(equation.get(d-1))||"(".equals(equation.get(d+1))||")".equals(equation.get(d+1))) 
        { 
         switch(equation.get(d)) 
         { 
          case "+": equation.set(d, "PLUS"); break; 
          default: equation.set(d, "MINUS"); 
         } 
        } 
        else 
        { 
         switch(equation.get(d)) 
         { 
          case "+": 
           n = Double.parseDouble(equation.get(d-1)); 
           n += Double.parseDouble(equation.get(d+1)); 
           equation.set(d-1, Double.toString(n)); 
           equation.remove(d); 
           equation.remove(d); 
           break; 
          default: 
           n = Double.parseDouble(equation.get(d-1)); 
           n -= Double.parseDouble(equation.get(d+1)); 
           equation.set(d-1, Double.toString(n)); 
           equation.remove(d); 
           equation.remove(d); 
         } 
        } 
       } 
      } 

      for(int d=0; d<equation.size(); d++) 
      { 
       switch(equation.get(d)) 
       { 
        case "PLUS": equation.set(d, "+"); break; 
        case "MINUS": equation.set(d, "-"); break; 
        case "TIMES": equation.set(d, "*"); break; 
        case "DIVBY": equation.set(d, "/"); break; 
        case "MOD":  equation.set(d, "%"); break; 
       } 
      } 

      for(int d=0; d<equation.size(); d++) 
      { 
       if(d>0) 
       { 
        if("(".equals(equation.get(d-1))&&")".equals(equation.get(d+1))) 
        { 
         equation.remove(d-1); 
         equation.remove(d); 
        } 
       } 
      } 
     } 

     for(int d=0; d<equation.size(); d++) 
     { 
      if("*".equals(equation.get(d))||"/".equals(equation.get(d))||"%".equals(equation.get(d))) 
      { 
       switch(equation.get(d)) 
       { 
        case "*": 
         n = Double.parseDouble(equation.get(d-1)); 
         n *= Double.parseDouble(equation.get(d+1)); 
         equation.set(d-1, Double.toString(n)); 
         equation.remove(d); 
         equation.remove(d); 
         break; 
        case "/": 
         n = Double.parseDouble(equation.get(d-1)); 
         n /= Double.parseDouble(equation.get(d+1)); 
         equation.set(d-1, Double.toString(n)); 
         equation.remove(d); 
         equation.remove(d); 
         break; 
        default: 
         n = Double.parseDouble(equation.get(d-1)); 
         n %= Double.parseDouble(equation.get(d+1)); 
         equation.set(d-1, Double.toString(n)); 
         equation.remove(d); 
         equation.remove(d); 
       } 
      } 
     } 

     for(int d=0; d<equation.size(); d++) 
     { 
      if("+".equals(equation.get(d))||"-".equals(equation.get(d))) 
      { 
       switch(equation.get(d)) 
       { 
        case "+": 
         n = Double.parseDouble(equation.get(d-1)); 
         n += Double.parseDouble(equation.get(d+1)); 
         equation.set(d-1, Double.toString(n)); 
         equation.remove(d); 
         equation.remove(d); 
         break; 
        default: 
         n = Double.parseDouble(equation.get(d-1)); 
         n -= Double.parseDouble(equation.get(d+1)); 
         equation.set(d-1, Double.toString(n)); 
         equation.remove(d); 
         equation.remove(d); 
       } 
      } 
     } 

     res = Double.parseDouble(equation.get(0)); 

     System.out.println(res); 

    } 
} 
+4

Используйте отладчик, чтобы узнать. Для уравнений с '()', вы можете рассмотреть структуру данных стека. –

+4

Святое гнездо Бэтмен! – squiguy

+0

Есть ли причина, по которой вы делаете это вручную? Что относительно вариантов, представленных в ответах на этот вопрос: http://stackoverflow.com/questions/1432245/java-parse-a-mathematics-expression-given-as-a-string-and-return-a-number – jefflunt

ответ

0

удалить все лишние элементы из строки говорят «(» «)» и поставить номер и символы в отдельной очереди, а затем получить каждый элемент как из очереди и в то же время держать на проверку погоды число или нет, если это число, получите следующий элемент в качестве символа

 Смежные вопросы

  • Нет связанных вопросов^_^