2012-05-03 222 views
0

我有一个问题,我在这个函数中找不到错误,它有时候可以很好地处理任何输入,但是当输入中有括号时,它会缓存{我想知道错误在哪里此代码,如何解决它,并有另一种更好的办法,而不是这样}将中缀表达式转换为后缀表达式

public static String Converting_infix_expressions_to_postfix_expressions(String infix) throws Exception{ 
    StringTokenizer st = new StringTokenizer(infix); 
    int numOF_tokens = st.countTokens(); 
    String postfix = "" ; 
    for (int i = 1; i <= numOF_tokens; i++) { 
     String term = st.nextToken(); 
     try { // if it is an Float there is no problem will happen 
      float x = Float.parseFloat(term); 
      postfix += x +" " ; 
      System.out.println("term is number " + term); 
     } catch (Exception e) { 
      System.out.println("term is symbol " + term); 
      if(stack.isEmpty()) 
       stack.push(term); 
      else if(term == "(") 
       stack.push(term); 
      else if(term == ")"){ 
       while((String)stack.peek() != "(") 
        postfix += stack.pop() +" "; 
       stack.pop(); 
      } 

      else{ 
       int x = 0,y = 0; 
       switch(term){ 
       case "+": x = 1; break; 
       case "-": x = 1; break; 
       case "*": x = 2; break; 
       case "/": x = 2; break; 
       } 
       switch((String)stack.peek()){ 
       case "+": y = 1; break; 
       case "-": y = 1; break; 
       case "*": y = 2; break; 
       case "/": y = 2; break; 
       } 
       if(x > y) 
        stack.push(term); 
       else { 
        int x1 = x , y1 = y; 
        boolean puchedBefore = false; 
        while(x1 <= y1){ 
         postfix += stack.pop() +" "; 
         if(stack.isEmpty() || stack.peek() == "("){ 
          stack.push(term); 
          puchedBefore = true; 
          break; 
         } 
         else{ 
          switch(term){ 
          case "+": x1 = 1; break; 
          case "-": x1 = 1; break; 
          case "*": x1 = 2; break; 
          case "/": x1 = 2; break; 
          } 
          switch((String)stack.peek()){ 
          case "+": y1 = 1; break; 
          case "-": y1 = 1; break; 
          case "*": y1 = 2; break; 
          case "/": y1 = 2; break; 
          } 
         } 
        } 
        if(!puchedBefore) 
         stack.push(term); 
       } 
      } 
     } 
    } 
    while(!stack.isEmpty()){ 
     postfix += stack.pop() +" "; 
    } 
    System.out.println("The postfix expression is : " + postfix); 
    return postfix; 
} 
+5

在比较字符串时,应该使用['equals'而不是'=='](http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java)。 – assylias

+0

您是否尝试过调试?获取一个您知道失败的案例并设置一个断点,然后逐步查看它做出的决定对您没有意义。此外,工作的表达式示例(以及它们的输出)和那些不工作(和他们的输出)将有助于使这是一个更好的问题。 – digitaljoel

+0

代码中有相当多的重复......你是否考虑写一个递归的递归解析器呢? –

回答

1

你有一对夫妇的问题与您的代码。

  1. 由于在括号和数字之间可能没有空格,因此您应该制作自定义字符串标记器。例如:(5 + 6)
  2. try-catch块没有正确使用。考虑一下,首先检查该字段是否为符号,然后将其解析为Float。这样可以避免让大部分代码出现在catch块中。
  3. 你指的是可以与后续的改变而固定线18

    而(!stack.isEmpty()& &(字符串)stack.peek()!= “(”)

    的错误
+0

同样的答案,但我想不用括号 返回Sting没有删除括号末尾的括号 – mohsen

+0

这是一个输入,程序与 坠毁1 * 2 + 3 *(5 + 2) - 3; – mohsen

+0

你有没有尝试上面提到的#3解决方案?我想你只是忘记检查堆栈是否为空。顺便说一下,这是你的功课吗? – user845279