1

JAVA RPn パーサー

else if (token.equals("-")) { op2 = stack.pop(); op1 = stack.pop(); stack.push(op2*-1);}

入力が「-4」または数字の前にマイナス記号が付いている場合、エラーが発生します

何か案が?

4

1 に答える 1

1

RPN (逆ポーランド記法) で負の数を解析する場合は、数値をスタックにプッシュする前にパーサーで検出する必要があります。

マイナス記号を読んでいて、次の記号 (スペースの前) が数字の場合、それは数字の一部になります。見てみましょう:

import java.util.*;

public class RPNParser {

    public static void main( String[] args ) {

        String rpnExp = "-4 3 + 5 * 3 - -61 *";
        String[] tokens = rpnExp.split( " " );

        Stack<Integer> stack = new Stack<Integer>();
        Integer op1 = null;
        Integer op2 = null;
        Integer result = null;

        for ( String token : tokens ) {

            if ( token.equals( "+" ) ) {
                op2 = stack.pop();
                op1 = stack.pop();
                stack.push( op1 + op2 );
            } else if ( token.equals( "-" ) ) {
                op2 = stack.pop();
                op1 = stack.pop();
                stack.push( op1 - op2 );
            } else if ( token.equals( "*" ) ) {
                op2 = stack.pop();
                op1 = stack.pop();
                stack.push( op1 * op2 );
            } else if ( token.equals( "/" ) ) {
                op2 = stack.pop();
                op1 = stack.pop();
                stack.push( op1 / op2 );
            } else {
                stack.push( Integer.valueOf( token ) );
            }

        }

        result = stack.pop();
        System.out.printf( "%s = %d\n", rpnExp, result );

    }

}

あなたが知っているかもしれないように:

-4 3 + 5 * 3 - -61 * = ((((-4 + 3) * 5) - 3) * -61) = 488
        postfix                     infix             result

文字列を手動で (分割を使用せずに) 解析したい場合は、さらに作業が必要になりますが、それは非常に簡単です。

String rpnExp = "-4    3 + 5 * 3 - -61 *";
StringBuilder newToken = new StringBuilder();
List<String> tokens = new ArrayList<String>();

for ( char c : rpnExp.toCharArray() ) {
    // the current char is a space?
    if ( c == ' ' ) {
        // yes, it is.
        // the new token has something?
        if ( newToken.length() > 0 ) {
            // yes, it has
            // add its value to the token list
            tokens.add( newToken.toString() );
            // resets new token
            newToken = new StringBuilder();
        }
    } else {   // c is not a space
        // yes, so add it to the newToken
        newToken.append( c );
    }
}

// needs to process the last value of newToken
// so, if it has something
if ( newToken.length() > 0 ) {
    // add the value to the token list
    tokens.add( newToken.toString() );
}

Stack<Integer> stack = new Stack<Integer>();
// the rest of the code here ...
于 2012-09-03T03:27:18.853 に答える