2015-07-10 26 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事底部。