Member 13650475 Ответов: 2

Исключение пустого стека!


import java.util.*;

public class BiggerStackProject
{
   public static void main(String args[]){
      String tester = "5+8-6*8";
      Stack<string> test = stackTheString(tester);
      int size = test.size();
      System.out.println(mathTheStack(test));
   }

   public static Stack<string> stackTheString(String input){
      Stack<string> original = new Stack<string>();
      String superTemp = null;
      for(int x = 0; x < input.length(); x++){
         String temp = Character.toString(input.charAt(x));
         original.push(temp);
      }
      return original;
   }

   public static double mathTheStack(Stack<string> input){
      Stack<string> operators = new Stack<string>();
      Stack<string> numbers = new Stack<string>();
      for(int x = 0; x < input.size(); x++){
         if(!(input.peek() == "+" || input.peek() == "-" || input.peek() == "*" || input.peek() == "/" || input.peek() == "%")){
            numbers.push(input.pop());
         }
      }
      for(int x = 0; x < input.size(); x++){
         if(input.peek() == "*" || input.peek() == "/" || input.peek() == "%"){
            operators.push(input.pop());
         }
         else{
            if(operators.pop().equals("*")){
               numbers.push(String.valueOf(Double.parseDouble(numbers.pop()) * Double.parseDouble(numbers.pop())));
            }
            else if(operators.pop().equals("/")){
               numbers.push(String.valueOf(Double.parseDouble(numbers.pop()) / Double.parseDouble(numbers.pop())));
            }
            else if(operators.pop().equals("+")){
               numbers.push(String.valueOf(Double.parseDouble(numbers.pop()) + Double.parseDouble(numbers.pop())));
            }
            else if(operators.pop().equals("-")){
               numbers.push(String.valueOf(Double.parseDouble(numbers.pop()) - Double.parseDouble(numbers.pop())));
            }
            else if(operators.pop().equals("%")){
               numbers.push(String.valueOf(Double.parseDouble(numbers.pop()) % Double.parseDouble(numbers.pop())));
            }
         }
      }
      return Integer.parseInt(numbers.pop());
   }
}


Я продолжаю получать это:
Exception in thread "main" java.util.EmptyStackException
	at java.util.Stack.peek(Stack.java:85)
	at java.util.Stack.pop(Stack.java:67)
	at BiggerStackProject.mathTheStack(BiggerStackProject.java:32)
	at BiggerStackProject.main(BiggerStackProject.java:8)

Process completed.


Что я уже пробовал:

Я просто ничего не могу понять.

2 Ответов

Рейтинг:
1

phil.o

Вы должны поставить точку останова в начале вашего mathTheStack метод и запустите сеанс отладки; это позволит вам проверить три стека и понять, почему строка 32 BiggerStackProject.java файл вызывает исключение, которое будет выброшено.
Быстро проверив ваш алгоритм, я думаю, что эта часть может представлять интерес:

for(int x = 0; x < input.size(); x++){
         if(input.peek() == "*" || input.peek() == "/" || input.peek() == "%"){
            operators.push(input.pop());
         }
         else{
            if(operators.pop().equals("*")){
               // ...

На первой итерации (x = 0), если первый символ является цифрой, выполняется блок else. В этот момент вы еще ничего не запихнули в стек операторов, и вы пытаетесь выскочить из него, что вызывает исключение.
Есть несколько способов сделать то, что вы пытаетесь достичь, но одна из первых вещей, которую вы можете попробовать, - это сначала квалифицировать как числа, так и стеки операторов, прежде чем пытаться их использовать. Вы только квалифицировали стек чисел в своем первом цикле, так что, может быть, вы могли бы переработать этот цикл, чтобы квалифицировать оба стека?

Кстати, почему вы обращаетесь с числами как со строками? Stack класс является универсальным, то есть вы можете использовать Stack<double> также.


Member 13650475

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

Рейтинг:
1

Patrice T

Я чувствую, получить свою ysage если operators.pop() что-то не так в вашем коде:

if(operators.pop().equals("*")){
   numbers.push(String.valueOf(Double.parseDouble(numbers.pop()) * Double.parseDouble(numbers.pop())));
}
else if(operators.pop().equals("/")){
   numbers.push(String.valueOf(Double.parseDouble(numbers.pop()) / Double.parseDouble(numbers.pop())));
}
else if(operators.pop().equals("+")){
   numbers.push(String.valueOf(Double.parseDouble(numbers.pop()) + Double.parseDouble(numbers.pop())));
}

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

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.