java.util.Ошибка выполнения EmptyStackException

#java #stack

#java #стек

Вопрос:

Это EmptyStackException продолжает появляться. Я не могу найти, в чем проблема, возникающая в этом коде. Отображается ошибка времени выполнения «java.util.Исключение EmptyStackException» каждый раз. Я должен добавить во входной массив A. Например, если A ={1,2,3}, я должен вернуть {1,2,4}. Перед MSB на входе может быть 0, а на выходе — нет.

 public class Solution {
    public ArrayList<Integer> plusOne(ArrayList<Integer> A) {
        int i,n,flag;
        flag=0;
        n=A.size();
        ArrayList<Integer> result=new ArrayList<>();
        Stack<Integer> s=new Stack<>();
        if(A.get(n-1)!=9)
        {
            s.push(A.get(n-1) 1);
            for(i=n-2;i>=0;i--)
            s.push(A.get(i));
        }
        else 
        {
            for(i=n-1;i>=0;i--)
            {
                if(A.get(i)==9)
                s.push(0);
                else 
                {s.push(A.get(i) 1);
                i--;
                break;}
            }
            for(i=i;i>=0;i--)
            {
                s.push(A.get(i));
                flag=1;
            }
            if(flag==0amp;amp;(i!=-1))
            s.push(1);
}
        while(true)
        {
            if(s.peek()==0)
           {
               s.pop();
           }
            else
            {
              break;
            }
        }
        while(true)
        {
            if(s.isEmpty())
            break;
            result.add(s.pop());
        }
        return resu<
    }
}
  

Комментарии:

1. while(true) {if(s.peek()==0) вы никогда не проверяете, действительно ли что-то есть в стеке, поэтому рано или поздно это peek сработает.

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

3. Исключение возникает в этой строке «if(s.peek()==0)»

Ответ №1:

Вот код функции peek в стековой реализации Java.

 public synchronized E peek() {
    int var1 = this.size();
    if (var1 == 0) {
        throw new EmptyStackException();
    } else {
        return this.elementAt(var1 - 1);
    }
}
  

Вы можете видеть, что если размер стека равен нулю, возникает исключение из пустого стека. Сначала необходимо проверить размер, прежде чем вызывать метод peek. Возможно, в вашем стеке нет элемента. Это может быть связано с вашей логикой выше. Вы можете проверить, пуст стек или нет, вызвав метод isEmpty в стеке. Если нет, то вы можете вызвать метод peek, иначе он вызовет исключение EmptyStackException.

 if(!s.isEmpty() amp;amp; s.peek()==0)
       {
           s.pop();
       }
  

Комментарии:

1. Привет, спасибо. Это сработало! Но я все еще не понимаю, почему он возвращает пустой массив, когда A = [9,9,9,9,9]

2. Потому что вы продолжаете вставлять материал внутри бесконечного цикла без проверки, поэтому он выбрасывается не на первой итерации, а после того, как вы вставили все остальные 9.

3. @TanyaAgarwal вам нужно отладить или выполнить предварительный запуск ваших значений, чтобы понять, почему он возвращает пустой. Пожалуйста, выберите этот ответ, если он помог вам решить проблему EmptyStackException.

Ответ №2:

Вы можете сделать это без Stack .

 static List<Integer> plusOne(List<Integer> list) {
    int size = list.size();
    List<Integer> result = new ArrayList<>(size   1);
    int carry = 1;
    for (int i = size - 1; i >= 0; --i) {
        int digit = list.get(i)   carry;
        result.add(0, digit % 10);
        carry = digit / 10;
    }
    if (carry > 0)
        result.add(0, carry);
    return resu<
}
  

и

 List<Integer> result = plusOne(List.of(9,9,9,9));
System.out.println(result);
  

вывод

 [1, 0, 0, 0, 0]
  

Комментарии:

1. Эй, это гораздо более чистый и простой подход. На самом деле я новичок в этом.