2015-12-10 7 views
1

Моя программа принимает постфиксное выражение и изменяет его на выражение infix.Что вызывает у меня это EmptyStackException?

Я включил две причины ошибки в коде, который есть, если программа не имеет достаточного числа операторов и если вход не является допустимым числом или оператором.

Ошибки поймали, когда я кладу на входе, что не хорошо, однако, при вводе правильного ввода в сканер дает мне эту ошибку:

Exception in thread "main" java.util.EmptyStackException 
    at java.util.Stack.peek(Stack.java:102) 
    at java.util.Stack.pop(Stack.java:84) 
    at PostfixToInfix.change(PostfixToInfix.java:67) 
    at PostfixToInfix.main(PostfixToInfix.java:27) 

Что нужно изменить в своем коде? Код:

import java.util.Scanner; 
import java.util.Stack; 
import java.util.EmptyStackException; 

public class PostfixToInfix 
{ 
    int x = 0; 

    public static void main(String[] args) 
    { 
     PostfixToInfix exp = new PostfixToInfix(); 
     Scanner stdin =new Scanner(System.in); 


     try { 
     boolean inputNeeded = true; 
     int value = 0; 

     while(inputNeeded){ 
      System.out.print("Postfix : "); 
      if(stdin.hasNextInt()){ 
       inputNeeded = false; 
      } 
      else{ 
       throw new Error("Not a number or valid operator"); 
      } 
     } 
      String pf = stdin.nextLine().replaceAll("\\s+", ""); 
      System.out.println("Infix : "+exp.change(pf)); 

     } 
     catch (EmptyStackException e) { 
      System.out.println("Too few operators to produce a single result."); 
     } 


    } 

    static boolean isOperator(char c) 
    { 
     if(c == '+' || c == '-' || c == '*' || c =='/' || c == '^') 
     { 
      return true; 
     } 
     return false; 

    } 
    boolean empty() //whether the stack is empty 
    { 
     return x == 0; 

    } // end empty 

    public String change(String pf) 
    { 
     Stack<String> s = new Stack<>(); 

     for(int i = 0; i < pf.length(); i++) 
     { 
      char z = pf.charAt(i); 
      if(isOperator(z)) 
      { 
       String x = s.pop(); 
       String y = s.pop(); 
       s.push("("+y+z+x+")");  
      } 
      else 
      { 
       s.push(""+z); 
      } 

     } 
     return s.pop(); 
    } 
} 

ответ

0

Рассмотрим ввод 1 1 +.

  • Сканер считывает 1 и сохраняет его в value.
  • Сканер считывает оставшуюся строку, а ее модифицированная версия ("1+") хранится в pf, которая передается в качестве аргумента для метода change.
  • charAt возвращает первый символ pf'1'), isOperator возвращает ложь, и блок выполняется еще, который выталкивает "1" в стек.
  • charAt возвращает второй символ pf (a '+'), isOperator возвращает true, и блок if выполняется.
  • pop вызывается один раз, удаляя единственный элемент в стеке, "1" и назначая его x. Стек теперь пуст, а второй вызов pop приводит к EmptyStackException.

Вот как отлаживать ваш код, если в IDE уже нет отладчика. Благодаря этому вы должны обнаружить, что использование nextInt является проблемой, так как только один номер будет присутствовать в оставшейся строке, когда блок if ожидает два.

+0

Давайте продолжим обсуждение в чате (http://chat.stackoverflow.com/rooms/97460/discussion-between-tnt-and-anderkat97). – TNT