Frage

Der veröffentlichte Code funktioniert für Operationen, funktioniert jedoch nicht, wenn zwischen den Operatoren und Operanden kein Abstand besteht.

Ich bekam 4 Ausdrücke zum Berechnen

  1. 10 2 8 * + 3 -

  2. 3 14+2*7/

  3. 4 2 + 3 15 1 - * +

  4. 1 2 + 3 % 6 - 2 3 + /

(abstand ist wichtig)

Ausdruck zwei ist derjenige, der mit meinem aktuellen Taschenrechner nicht berechnet wird

Hier ist mein Code

  import java.util.*;
  public class PostFix {

   public static void main(String []args){

    Stack<Integer> stack = new Stack<Integer>();
    System.out.println("Input your expression using postfix notation");
    Scanner input = new Scanner(System.in);
        String expr = input.nextLine();
        StringTokenizer tokenizer = new StringTokenizer(expr);

    while(tokenizer.hasMoreTokens()){
        String c = tokenizer.nextToken();
        if(c.startsWith("0")|| c.startsWith("1")||c.startsWith("2")||c.startsWith("3")||c.startsWith("4")||
            c.startsWith("5")||c.startsWith("6")||c.startsWith("7")||c.startsWith("8")||c.startsWith("9"))
            stack.push(Integer.parseInt(c));
        else if(c.equals("+")){
            int op1 = stack.pop();
            int op2= stack.pop();
            stack.push(op2+op1);
        }
        else if(c.equals("-")){
            int op1 = stack.pop();
            int op2= stack.pop();
            stack.push(op2-op1);
        }
        else if(c.equals("*")){
            int op1 = stack.pop();
            int op2= stack.pop();
            stack.push(op2*op1);
        }
        else if(c.equals("/")){
            int op1 = stack.pop();
            int op2= stack.pop();
            stack.push(op2/op1);
        }
        else if(c.equals("%")){
            int op1 = stack.pop();
            int op2= stack.pop();
            stack.push(op1%op2);
        }



    }
System.out.println(stack.pop());

}
   }

Hier ist der StackTrace

 Input your expression using postfix notation
 3 14+2*7/
 Exception in thread "main" java.lang.NumberFormatException: For input string:  "14+2*7/"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at PostFix.main(PostFix.java:18)
War es hilfreich?

Lösung

Wenn Sie wirklich verwenden müssen StringTokenizer, konstruiere es so:

StringTokenizer tokenizer = new StringTokenizer(expr, " +-*/%", true);

Der zweite Parameter besagt, dass neben Leerzeichen auch Leerzeichen und alle Operatoren als Trennzeichen betrachtet werden.Der dritte Parameter besagt, dass die Trennzeichen als Token behandelt werden, also wenn es sieht "+", "-", usw., es wird das als Zeichenfolge zurückgeben.Es wird auch Leerzeichen zurückgeben, also müssen Sie sicherstellen, dass wann nextToken zurückgeben " ", ignorieren Sie es und behandeln es nicht als Fehler.

Andere Tipps

Alternativ, wenn Sie StreamTokenizer nicht verwenden können, verwenden Sie die 3-Argument-Version des StringTokenizer-Konstruktors:

generasacodicetagpre.

Das macht '' ',' + ',' * ',' - 'und' / 'Trenner und berichten Sie sie auch als Token.

Verwenden Sie einen Streamtokenizer zum Analysieren, siehe http://docs.oracle.com/javase/7/docs/api/java/i/streamtokenizer.html

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top