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

#java #queue #stack

Вопрос:

 private MyStack stack1 = new MyStack();
private MyStack stack2 = new MyStack();

    public int dequeue() {
            int x = 0;
            while(!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }
            return x;
        }
 

Программа предназначена для перемещения элементов из стека 1 в стек 2. Проблема в том, что он создает исключение StackEmptyException, когда я перемещаюсь из стека 1 в 2. Я попытался протолкнуть обычные целые числа в обе стопки, и это показалось мне нормальным.

 public class MyStack {
    static final int MAX = 100;
    private int[] array = new int[MAX];
    private int top;
    
    public MyStack(){
        top = -1;
    }
    
    boolean isEmpty() {
        return (top < 0);
    }
    
    public void setArraySize(int x) {
        array = new int[x];
    }
    
    public int peek(){ // displays the number on top of stack
        return array[top];
    }
    
    public void push(int x) { // puts a number on top of stack
        if(top>=array.length-1) {
            System.out.println("StackFullException");
        }
        array[  top] = x;
    }
    
    public int pop() { // removes the number that is on top of stack
        if(top<array.length) {
            System.out.println("StackEmptyException");
        }
        int x = array[top--];
        return x;
    }
}
 

Это мое объявление стека, основанное на массиве.

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

1. Можете ли вы опубликовать объявление stack1 и stack2? Если это ваши собственные реализации, может потребоваться и их код.

2. Это мой первый раз, когда я спрашиваю в стеке, я сразу же

3. Я попробовал этот код с переменными, определенными как Deque<Integer> stack1 = new LinkedList<>(); и stack2 определенными аналогично, используя типы из java.util.* и вводя несколько значений stack1 перед вызовом, и он работал просто отлично.

4. ДА. условие в pop неправильном. Он всегда считает, что стек пуст. Замените его, if (isEmpty()) и все должно быть хорошо. @user16320675 если вы опубликуете это в качестве ответа, я буду рад его озвучить.

5. Я только сейчас это заметил и не могу поверить, что мне потребовалось пару дней, чтобы это увидеть. Спасибо, чувак!

Ответ №1:

 public int pop() { // removes the number that is on top of stack
    if(top<0) {
        System.out.println("StackEmptyException");
    }
    int x = array[top--];
    return x;
}

 

Я по ошибке установил свой оператор if, чтобы выбросить StackEmptyExeception, если сверху