2012-02-07 26 views
-1

接尾辞を接頭辞に変換する方法を理解して、自動的にそれを計算する方法を書く方法を理解しようとしています。ここで接頭辞から接頭辞への計算

は、私が上で行っているものです私自身、それが正しいか、私が何を間違ってやっているなら、私に教えてください:(D/E)の

順序を

%のBC-操作は次のとおりです。

  • 括弧
  • べき乗$
  • 乗算、除算およびモジュラス%
  • 加算および減算

最初の括弧:(/デ)

次係数(%AB)

減算右から左へ。 - %abc/de

最後のもの: - %abc/de

/** 
* Calculate infix to postfix 
*/ 
public String calcInfixToPostfix(String eq){ 

    char arr[] = eq.toCharArray() ; 
    String val, x,y,z, w; 
    boolean answer = false, notEmpty = true; 
    Stack<String> operandStack = new Stack<String>(); 
    Stack<String> operatorStack = new Stack<String>(); 

    for(char c: arr){ 

     val = Character.toString(c);   
     answer = isOperator(val); 

     if(!answer/* is operand */){ 

      operandStack.push(val); 

     } 
     else{ 

       if(operatorStack.isEmpty()){ 

        operatorStack.push(val); 
       } 
       else{ 

        if(/* stack value */ (precedenceLevel(operatorStack.peek().charAt(0))) >= (precedenceLevel(c) /* input value */)){ 

         do{ 

          x = operandStack.pop(); 
          y = operandStack.pop(); 
          z = operatorStack.pop(); 
          w = y+x+z; 
          operandStack.push(w); 

          if(operatorStack.isEmpty() /* end loop if stack if empty */){        
          break; 
          } 
          if(/* top of operator stack */ (precedenceLevel(operatorStack.peek().charAt(0))) < (precedenceLevel(c) /* input value */)){ 
          break; 
          } 

         } while(notEmpty);      
        } 

        operatorStack.push(val); 
       } 
     } 
    } 

    do{ 
     x = operandStack.pop(); 
     y = operandStack.pop(); 
     z = operatorStack.pop(); 
     w = y+x+z; 
     operandStack.push(w); 

     if(operatorStack.isEmpty() /* end loop if stack if empty */){        
     break; 
     } 

    }while(notEmpty); 

    String out = operandStack.pop(); 
    return out;   
} 


/** 
* Determines if the value is an operator 
* @param val 
* @return boolean is operator or not 
*/ 
public boolean isOperator(String val){ 

    if(
      (val.equals(String.valueOf(add))) || (val.equals(String.valueOf(sub))) || 
      (val.equals(String.valueOf(mul))) || (val.equals(String.valueOf(div))) || 
      (val.equals(String.valueOf(mod))) || (val.equals(String.valueOf(exp))) || 
      (val.equals(String.valueOf(parL)))|| (val.equals(String.valueOf(parR))) 
     ) 
    {   
     return true;  
    } 
    else{ 
     return false; 
    } 
} 

/** 
* Calculates a value for each operator based on it's precedence 
* ORDER OF OPERATION FOR INFIX 
* Parentheses 
* Exponentiation 
* Multiplication, division and modulus 
* Addition and subtraction 
* @param op char the value being tested 
* @return int return precedence level of operator 
*/ 
public int precedenceLevel(char op) { 
    switch (op) { 
     case add: 
     case sub: 
      return 0; 
     case mul: 
     case div: 
     case mod: 
      return 1; 
     case exp: 
      return 2; 
     case parL: 
     case parR: 
      return 3; 
     default: 
      System.out.println("error! invalid operator"); 
       break; 
    } 
} 
+1

宿題のような音ですね。 – Thomas

+1

正しいです...ここに問題のプログラミングがありますか、またはあなたの数学の宿題に助けを求めるだけですか? – Foggzie

答えて

0

はい、その変換は正しいです。

接尾辞を接頭辞に変換する方法を理解して、自動的にそれを計算するメソッドを作成しています。

この場合、shunting-yard algorithmをご覧ください。これは自動的にprefix (Polish) notationを生成するために使用できます。

+0

はいそれは宿題ですが、私は接頭辞と接頭辞に逆順を使って書く必要があるプログラムです。基本的に私はちょうど私がステップを正確にフォローしていることを確認する必要がありました。私は働いているプログラムを持っていますが、かっこなしの問題でのみ動作します。今私は括弧を実装する必要があります。 – reagan

+0

誰かが見たい場合に備えて私のプログラムを追加しました。 – reagan

0

はい。これはあなたがそれを理解したかのように見えます。

数値ではなく、実際のプログラミングに関する質問を投稿してください。

関連する問題