#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. Эй, это гораздо более чистый и простой подход. На самом деле я новичок в этом.