2

中置式を後置式に変換するプログラムを作成しました。ただし、複数の入力を取り、0 を見つけたら停止する必要があります。

私が持っているのは、

入力: (3+4)*(3-1)

出力: 4 + 3 1 - *

私が必要なのは、

入力:

(3+4)*(3-1)

(3*4)-(3*1)

(3+4)*(3-1)

(3+2)*((3-3)

(3+4)*(3-1)

0

出力:

4 + 3 1 - *

4 * 3 1 * -

4 + 3 1 - *

構文エラー

4 + 3 1 - *

終わり

コードは次のとおりです。

public static void main(String args[])throws IOException
{
    BufferedReader input = new BufferedReader (new InputStreamReader(System.in));
    String s = input.readLine();
    String pf = new String();
    int i=0, check=0;
    Stack<Character> s1 = new Stack<>();


    while(i<s.length())
    {
        if(isOperand(s.charAt(i)))
        {
            pf += s.charAt(i);
        }
        else if(isOperator(s.charAt(i)))
        {
            while (!s1.empty() && s1.peek() != '(' && compareOperators(s1.peek(),s.charAt(i)) <= 0)
            {
                pf += ' ';
                pf += s1.peek();
                s1.pop();
            }
            pf += ' ';
            s1.push(s.charAt(i));
        }
        else if (s.charAt(i) == '(') 
        { 
            s1.push(s.charAt(i));
        }
        else if (s.charAt(i) == ')') 
        {
            check++;
            while (!s1.empty()) 
            {
                if ((char)s1.peek() == '(') 
                { 
                    check--;
                    s1.pop(); 
                    break; 
                }
                pf += ' ';
                pf += s1.peek();
                s1.pop();
            }
        }
        i++;
    }


    while (!s1.empty()) {
        if(s1.peek()=='(')
            check--;
        pf += ' ';
        pf += s1.peek();
        pf += ' ';
        s1.pop();
    }
    if(check!=0)
        System.out.println("Syntax Error");
    else
    {
        System.out.println(pf);

    }

}

誰でも私を助けることができますか?

4

2 に答える 2

2

インフィックスからプレフィックスへの変換のコードを別の関数に入れます。

public void convert(String s) {
    String pf = new String();
    int i=0, check=0;
    Stack<Character> s1 = new Stack<>();


    while(i<s.length())
    {
        if(isOperand(s.charAt(i)))
        {
            pf += s.charAt(i);
        }
        else if(isOperator(s.charAt(i)))
        {
            while (!s1.empty() && s1.peek() != '(' && compareOperators(s1.peek(),s.charAt(i)) <= 0)
            {
                pf += ' ';
                pf += s1.peek();
                s1.pop();
            }
            pf += ' ';
            s1.push(s.charAt(i));
        }
        else if (s.charAt(i) == '(') 
        { 
            s1.push(s.charAt(i));
        }
        else if (s.charAt(i) == ')') 
        {
            check++;
            while (!s1.empty()) 
            {
                if ((char)s1.peek() == '(') 
                { 
                    check--;
                    s1.pop(); 
                    break; 
                }
                pf += ' ';
                pf += s1.peek();
                s1.pop();
            }
        }
        i++;
    }


    while (!s1.empty()) {
        if(s1.peek()=='(')
            check--;
        pf += ' ';
        pf += s1.peek();
        pf += ' ';
        s1.pop();
    }
    if(check!=0)
        System.out.println("Syntax Error");
    else
    {
        System.out.println(pf);

    }

}

次に、メイン関数で:

public static void main(String args[])throws IOException
{
    BufferedReader input = new BufferedReader (new InputStreamReader(System.in));
    String s;
    while(true) {
        s = input.readLine();
        if (s.equals("0"))
            break;
        else 
            convert(s);
    }    
}
于 2013-09-28T20:38:08.080 に答える
1

交換してみる

    String s = input.readLine();

    String s;
    while(!(s = input.readLine()).equals("0")){

最後にブラケットを追加します。で各行を読み取り、毎回使用する前に で(s = input.readLine()0 に等しくないことを確認します。!s.equals(0)

于 2013-09-28T20:35:34.823 に答える