Postfix Calc работает только с надлежащим расстоянием (то есть. 3 14 2 * 7 / выбрасывает исключение)

StackOverflow https://stackoverflow.com//questions/20013474

Вопрос

Код опубликован работает для операций, но не будет работать, если между операторами и операндами нет между операторами.

Мне дали 4 выражения для вычисления

  1. 10 2 8 * + 3 -

  2. 3 14 + 2 * 7 /

  3. 4 + 3 15 1 - * +

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

  5. (расстояние важно)

    Выражение два - это тот, который не будет вычислять, используя мой текущий калькулятор

    Вот мой код

      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());
    
    }
       }
    
    .

    Вот укладок

     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)
    
    .

Это было полезно?

Решение

Если вам действительно нужно использовать StringTokenizer, построить его так:

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

Второй параметр говорит, что пробелы и все операторы считаются разделителями, в дополнение к пробелам.Третий параметр говорит, что разделители рассматриваются как токены, поэтому, когда он видит "+", "-" и т. Д., Он вернет это как строку.Он также вернет пробелы, поэтому вы должны убедиться, что когда nextToken возвращает " ", вы игнорируете его и не обращаетесь к нему как ошибка.

Другие советы

В качестве альтернативы, если вы не можете использовать StreamTokedizer, используйте версию 3-аргумента конструктора StringTokleizer:

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

Это сделает «, '+', '*', '-' и '/' разделители, а также сообщать им как токены.

Используйте StreamTokedizer для анализа, см. http://docs.orcle.com/javase/7/docs/api/java/io/streamtkenizer.html

StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(expr));
tokenizer.ordinaryChar('/');  // see comments

while(tokenizer.nextToken() != StreamTokenizer.TT_EOF){
  if (tonenizer.ttype == StreamTokenizer.TT_NUMBER) {
    stack.push(Integer.parseInt(tokenizer.sval));
  } else {
    int op1 = stack.pop();
    int op2 = stack.pop();
    switch (ttype) {
      case '+': op2 += op1; break;
      case '-': op2 -= op1; break;
      case '*': op2 *= op1; break;
      case '/': op2 /= op1; break;
    }
    stack.push(op2);
  }
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top