2015-07-10 8 views
-3

Я немного оглянулся на решение для разбора химической формулы, содержащей молекулярные компоненты, которые могут иметь свои собственные суффиксы для того, чтобы иметь возможность анализировать формулу для полной атомной фракции.Расширение молекулярной нотации химической формулы

Как сделать это на Java?

ответ

0

Не удалось найти способ сделать это в короткие сроки (и не проделал забавный алгоритм в то время). Я решил реализовать стек, поскольку он на самом деле менее сложный, чем стек математической операции.

Возвращаясь назад через стек, вам нужно только знать о нескольких вещах, поскольку это принципиально модифицированная реализация общего решения для разбора математического утверждения.

1) Ваше целое число суффикс может быть построен из нескольких символов
2) Ваше число суффикс может быть мультипликатором (следующий символ будучи «)»)
3) Вы должны обращаться за неявные «1» s

Реализация выдает символы из одного стека и толкает только буквы и цифры в ваш «стек возврата».

String expandFormula(String s){ 
    Stack<Character> stack = new Stack(); 
    Stack<Character> hanoi = new Stack(); 
    char[] ca = s.toCharArray(); 
    Character c; 
    List<Integer> multipliers = new ArrayList(); 
    String multiBuff; 

    int val; 
    boolean flag; 

    for (int i = 0; i < ca.length; i++) 
     stack.push(ca[i]); 

    while(!stack.isEmpty()){ 
     c = stack.pop(); 
     if (Character.isLetter(c)){ 
      try{ 
       //previous parse was end of Symbol, implicit "1" 
       flag = Character.isUpperCase(hanoi.peek()); 
      } 
      catch(EmptyStackException ese){ //change exception 
       flag = false; 
      } 
      //push implicit 1 
      if (flag){ 
       stack.push(c); 
       stack.push('1'); 
      } 
      //continue as usual 
      else 
       hanoi.push(c); 
     } 
     //begin number parsing 
    else if(Character.isDigit(c)){ 
      flag = false; 
      multiBuff = c +""; 
      //parse the integer out 
      while(Character.isDigit(stack.peek())){ 
       c = stack.pop(); 
       multiBuff = c + multiBuff; 
      } 
      //if next char is), then value is a suffix 
      if (stack.peek() == ')'){ 
       flag = true; 
       stack.pop(); 
       multipliers.add(Integer.parseInt(multiBuff)); 
       //pop successive)s 
       while(stack.peek() == ')'){ 
        stack.pop(); 
        multipliers.add(1); 
       } 
      } 
      if(Character.isLetter(stack.peek())){ 
       val = flag ? 0 : Integer.parseInt(multiBuff); 
       //get full value of 
       for(Integer i : multipliers){ 
        if (val == 0) 
         val = i; 
        else 
         val *= i; 
       } 
       //trim and push first decibit 
       while(val > 0){ 
         hanoi.push(Character.forDigit(val % 10, 10)); 
         val /= 10; 
       } 
      } 
     } 
     //end of nest, remove most recent multiplier 
     else if(c == '(') 
      try{ 
       multipliers.remove(multipliers.size()-1); 
      } 
      catch(ArrayIndexOutOfBoundsException aioobe){ 

      } 
    } 
    multiBuff = ""; 
    while(!hanoi.isEmpty()) 
     multiBuff += hanoi.pop(); 

    return multibuff;   
} 

Это решение может быть преобразован непосредственно в свой выходной строки с помощью:

1) Изменение "ханой" в строку
2) Изменение "hanoi.push (с)" Ханойский = C + Ханоя
3) Изменение "hanoi.peek()" в "hanoi.charAt (0)"
4) Изменение исключения по мере необходимости (или использовать общие исключения в любом случае)
5) Просто вернуться Ханоя вместо multibuff вещи на дно.