0

中置式を取り、後置式に変換するコンバーターを作成しています。

Example:
Infix: 2 * 3 - 10 / 4
Postfix: 2 3 * 10 4 / -

私は完全にコード化されたメソッドを持っていますが、それが返す後置式は

2     3   *   1 0     4 / -

これには 2 つの問題があります。 1. 主な問題は、1 と 0 の間にスペースがあることです。2.余分なスペースがたくさんあります。出力は上記の例のようになります。

中置式から後置式への変換について調査しましたが、1 桁以上の式変換を行う方法を特定できませんでした。

以下は私の postfixtoinfix クラスに添付されています。expression 変数は、上記の例で示されている中置記号を完全な間隔で保持します。

import java.util.*;

public class InfixToPostfix
{
//Declare Instance Variables
private String expression;
private Stack<Character> stack = new Stack<Character>();

//Constructor
public InfixToPostfix(String infixExpression)
{
        expression = infixExpression;
}//End of constructor

//Translate's the expression to postfix
public String translate()
{
    //Declare Method Variables
    String input = "";
    String output = "";
    char character = ' ';
    char nextCharacter = ' ';

    for(int x = 0; x < expression.length(); x++)
    {
        character = expression.charAt(x);

        if(isOperator(character))
        {
            while(!stack.empty() && precedence(stack.peek())>= precedence(character))
                output += stack.pop() + " ";
            stack.push(character);
        }   
        else if(character == '(')
        {
            stack.push(character);
        }
        else if(character == ')')
        {
            while(!stack.peek().equals('('))
                output += stack.pop() + " ";
            stack.pop();
        }
        else
        {
            if(Character.isDigit(character) && (x + 1) < expression.length() && Character.isDigit(expression.charAt(x+1)))
            {
                output += character;
            }
            else if(Character.isDigit(character))
            {
                output += character + " ";
            }   
            else
            {
                output += character;
            }
        }
    }//End of for

    while(!stack.empty())
    {
        output += stack.pop() + " ";
    }

    return output;
}//End of translate method

//Check priority on characters
public static int precedence(char operator)
{
    if(operator == '+' || operator =='-')
        return 1;
    else if(operator == '*' || operator == '/')
        return 2;
    else
        return 0;
}//End of priority method

public boolean isOperator(char element)
{
    if(element == '*' || element == '-' || element == '/' || element == '+')
        return true;
    else
        return false;
}//End of isOperator method

}//End of class
4

3 に答える 3

2

あなたのコードは、「10」を単一のエンティティとしてではなく、「1」と「0」という 2 つの別個の文字として認識しています。演算子または括弧ではないものについては、目的の代わりにoutput += character + " ";あなたを与えることになります。1 010

于 2012-05-11T20:50:56.990 に答える
0

任意の算術式をその中置 from (つまり算術式の従来型) から後置形式に変換する問題は、最初に見えるほど単純ではありません。

算術式はコンテキスト フリー言語を表し、プッシュダウン オートメーションを使用して認識できます。このような認識の結果として、構文ツリーまたは AST (抽象構文ツリー) を構築することができ、後置形式を構築するためにボトムアップでたどることができます。

理論をあまり説明しない、これに関する優れた実用的な本はLanguage Implementation Patternsです。これを強くお勧めします。

于 2012-05-11T20:55:48.217 に答える
0

@digitaljoelが言ったように、完全な単語をトークンとしてではなく、個々の文字を字句トークンとして認識しています。

単一の文字を読み取り、それがどのトークン (演算子またはオペランド) であるかを判断する代わりに、入力から次の完全なトークンを読み取るメソッドをパーサーに呼び出させる必要があります。トークンは、文字列 (トークンを構成する 1 つ以上の文字を含む) またはクラス オブジェクト (トークンのテキストと何らかの種類の token_type プロパティを含む) として返すことができます。

そうしないと、パーサーは 1 文字のトークンのみを処理するように制限されます。

別の字句解析器を使用してトークンを読み取るもう 1 つの利点は、パーサーではなく字句解析器で空白を処理できることです。

于 2012-05-11T21:29:05.370 に答える