2015-07-10 27 views
-3

我環顧了一下,找出一個解決方案,解析出一個化學分子式,其中含有可能有其自己後綴的分子組分,以便能夠解析其完整原子分數的公式。化學式的分子符號的擴展

在Java中如何做到這一點?

回答

0

在短時間內沒有找到辦法做到這一點(而且沒有在一段時間內完成一個有趣的算法)我決定使用棧實現,因爲它實際上比數學操作棧複雜。

在堆棧中往回走,你只需要知道幾件事情,因爲這基本上是解析數學語句的通用解決方案的修改實現。

1)你的整數後綴可建的多個字符
2)你的整數後綴可以是一個倍增器(下一個字符是一個「)」)
3)你需要處理隱含的「1」

該實現將字符從一個堆棧中彈出,並只將字母和數字壓入「返回堆棧」。

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)」,以河內= C +河內
3)改變 「hanoi.peek()」 到 「hanoi.charAt(0)」
4)變更例外必要(或使用一般例外反正)
5)而就在返回河內,而不是multibuff事底部。