2012-03-01 6 views
1

インフィクスを後置に変換するプログラムを書くことになっています。それはいくつかの場合には正しく動作しますが、他の時は正しく動作しません。特に小括弧を含む中置式について。誰が私にこのことが間違っているのかを伝えることができますか?例えば、中置式インフィクスからポストフィックスへのプログラムが動作しない

((5 + 5 * (6 - 2) + 4^2) * 8) 

は、5562-*42^++8*((2を返します。

import java.io.*; 
import java.util.Scanner; 

public class InfixToPostfix 
{ 
    //class attributes 
    private char curValue; 
    private String postfix; 
    private LineWriter lw; 
    private ObjectStack os; 

    //constructor 
    public InfixToPostfix(LineWriter l, ObjectStack o) 
    { 
    curValue = ' '; 
    lw=l; 
    os=o; 
    } 

    public String conversion(String buf) 
    { 
    String temp =" "; 
    StringBuffer postfixStrBuf= new StringBuffer(temp); 
    char popped= new Character(' '); 
    char topped=' '; 

    for (int i=0; i<buf.length(); i++) 
    { 
     curValue= buf.charAt(i); 

     if (curValue == '(') 
     os.push(curValue); 

     if (curValue == ')') 
     { 
     while (popped != '(') 
     { 
      popped = ((Character)os.pop()); 
      if (popped != '(') 
      postfixStrBuf.append(popped); 
     } 
     } 

     if (isOperator(curValue)) 
     { 
     if(os.isEmpty()) 
      os.push((Character)(curValue)); 
     else 
      topped=((Character)os.top()); 

     if ((priority(topped)) >= (priority(curValue)) && (topped != ' ')) 
     { 
      popped = ((Character)os.pop()); 
      if (popped != '(') 
      postfixStrBuf.append(popped); 
      //if it is a left paranthess, we want to go ahead and push it anyways 
      os.push((Character)(curValue)); 
     } 

     if ((priority(topped)) < (priority(curValue)) && (topped != ' ')) 
      os.push((Character)(curValue)); 
     } 

     else if (!isOperator(curValue) && (curValue != ' ') && (curValue != '(') && (curValue != ')')) 
     postfixStrBuf.append(curValue); 
    } 

    //before you grab the next line of the file , pop off whatever is remaining off the stack and append it to 
    //the infix expression 

    getRemainingOp(postfixStrBuf); 

    return postfix; 

    //postfixStrBuf.delete(0, postfixStrBuf.length()); 
    } 

    public int priority(char curValue) 
    { 
    switch (curValue) 
    { 
     case '^': return 3; 
     case '*': 
     case '/': return 2; 
     case '+': 
     case '-': return 1; 
     default : return 0; 
    } 
    } 

    public boolean isOperator(char curValue) 
    { 
    boolean operator = false; 
    if ((curValue == '^') || (curValue == '*') || (curValue == '/') || (curValue == '+') || (curValue == '-')) 
     operator = true; 
    return operator; 
    } 

    public String getRemainingOp(StringBuffer postfixStrBuf) 
    { 
    char popped=' '; 
    while (!(os.isEmpty())) 
    { 
     opped = ((Character)os.pop()); 
     postfixStrBuf.append(popped); 
    } 
    postfix=postfixStrBuf.toString(); 
    return postfix; 
    } 
} 
+0

あなたのコードを読む私はあなたの質問に答える気がしません。 – Alexander

+0

これは答えが明白であるか、それが意味をなさないためですか? – user1175955

答えて

0

私は唯一の内部ループは(どこでも鋳物なし)のようになりますどのように掲載します:

if (curValue == '(') { 
    os.push(curValue); 
} else if (curValue == ')') { 
    if(!os.isEmpty()) { 
     topped = os.pop(); 
     while (!os.isEmpty() && (topped != '(')) { 
      postfixStrBuf.append(topped); 
      topped = os.pop(); 
     } 
    } 
} else if (isOperator(curValue)) { 
    if (os.isEmpty()) { 
     os.push(curValue); 
    } else { 
     while(!os.isEmpty() && (priority(os.top()) >= priority(curValue))) { 
      popped = os.pop(); 
      postfixStrBuf.append(popped); 
     } 
     os.push(curValue); 
    } 
} else if (curValue != ' ') { 
    postfixStrBuf.append(curValue); 
} 

開示:それはすでにかなり遅くので、私はそれは大丈夫です願っています。変数が初期化され、getRemainingOpメソッドが返される方法を修正する必要があります。

+0

ありがとう、アレクサンダー、本当にありがとう。私はgetRemainingOp – user1175955

+0

@ user1175955で作業しますが、答えとしてマークする必要があります。 – Alexander

関連する問題