1

すでにSOにこれと同様の質問があることは知っていますが、私が抱えている問題を解決する質問を見つけることができません。正しい出力を得るために演算子の優先順位を実装しながら、中置記法式を後置記法に変換するメソッドを作成しようとしています。私は通常のメソッド(push、pop、peekなど)を使用して独自のスタッククラスを作成しましたが、これは完全に正常に機能します。私の問題は、A-(B + C ^ D ^ C)/ D * Bなどのより複雑な式の場合、間違った出力が得られることです。変換の結果はABCDC^^+ D / B *-になるはずですが、私はABCDC ^^ + D/-Bを取得し続けます

これが私の方法です:

    public static String infixToPostfix(char[] expressionArray, CharStack opStack){
    String output = "";
    int length = expressionArray.length;
    for(int i = 0; i < length; i++){    
        if(isOperatorOrBracket(expressionArray[i])){ 
            if(priorityAtInput(expressionArray[i]) >= priorityAtStack(opStack.peek())){
                opStack.push(expressionArray[i]);
            }else if(priorityAtInput(expressionArray[i]) == priorityAtStack(opStack.peek())){
                output = output + expressionArray[i];
            }else{
                while(opStack.peek() != '('){
                    output = output + opStack.pop();
                }
                opStack.pop();
            }
        }else{
            output = output + expressionArray[i];
        }
    }
    while(!opStack.empty()){
        if(opStack.peek() != '('){
            output = output + opStack.pop();
        }else if(opStack.peek() == '('){
            opStack.pop();
        }
    }
    return output;
}

コンポーネントメソッドのいずれかが必要な場合はお知らせください。どんな助けでも大歓迎です!

4

1 に答える 1

0

画面を1時間見つめた後、問題が見つかりました。Eclipseのデバッガーに感謝します!

public static String infixToPostfix(char[] expressionArray, CharStack opStack){
    String output = "";
    int length = expressionArray.length;
    for(int i = 0; i < length; i++){    
        if(isOperatorOrBracket(expressionArray[i])){ 
            if(priorityAtInput(expressionArray[i]) >= priorityAtStack(opStack.peek())){
                opStack.push(expressionArray[i]);
            }else if(priorityAtInput(expressionArray[i]) < priorityAtStack(opStack.peek())){
                while(priorityAtInput(expressionArray[i]) < priorityAtStack(opStack.peek())){
                    output = output + opStack.pop();
                    if(opStack.peek() == '('){
                        opStack.pop();
                        break;
                    }else if(priorityAtInput(expressionArray[i]) >= priorityAtStack(opStack.peek())){
                        opStack.push(expressionArray[i]);
                        break;
                    }
                }
            }else{
                while(opStack.peek() != '('){
                    output = output + opStack.pop();
                }
                opStack.pop();
            }
        }else{
            output = output + expressionArray[i];
        }
    }
    while(!opStack.empty()){
        if(opStack.peek() != '('){
            output = output + opStack.pop();
        }else if(opStack.peek() == '('){
            opStack.pop();
        }
    }
    return output;
}
于 2012-11-05T18:43:44.230 に答える