java.util.EmptyStackException运行时错误

问题描述

此EmptyStackException继续弹出。我无法找到此代码中发生的问题。每次都会显示运行时错误“ java.util.EmptyStackException”。我应该添加到输入数组A.例如如果A = {1,2,3},我应该返回{1,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==0&&(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 result;
    }
}

解决方法

这是Java的Stack实现中的peek函数的代码。

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

您可以看到,如果堆栈的大小为零,则将引发空堆栈异常。在调用peek方法之前,您需要首先检查大小。您的堆栈可能没有任何元素。这可能是由于您的上述逻辑所致。您可以通过在堆栈上调用isEmpty方法来检查堆栈是否为空。如果不是,则可以调用peek方法,否则它将引发Empty和StackEmpty。

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

您可以在没有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 result;
}

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

输出

[1,0]