Почему stack.pop не принимает stack.push в качестве параметра? - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь создать метод, чтобы иметь возможность вставлять узел в позицию n в моем специально разработанном стеке (построенном на массиве).Когда я использую stack.pop() в качестве параметра в stack.push(), я получаю ArrayIndexOutOfBoundsException: -1.

Я попытался заменить stack.pop(stack.push()) на переменную, представляющую его, и получил то же исключение (ArrayIndexOutOfBoundsException: -1).

Класс стека

public class Stack {

    public Node[] stackList = new Node[12]; 
    int index = 0; //Sets index to 0

    public void push(Node node){ //Adds nodes to the top of the stack.
        stackList[index] = node; 
        if (index < (stackList.length - 1)){ 
            index++;
        }
    }

    public Node pop(){ //Removes node from stack.
        Node output = stackList[index];
        stackList[index] = null;
        index--;
        return output;
    }

    public void printStack(){
        for (int j = 0; j < stackList.length; j++){ 
            stackList[j].printValue();  
        }
    }
    public int size(){
        return stackList.length;
    }

    public void insertNode(int val, int pos, Stack stack){
        Stack tmpstack = new Stack();
        Node value = new Node();
        value.changeValue((val));

        int i=0; //Sets index to 0
        while(i<pos){
            tmpstack.push(stack.pop());
            i++;
        }
        stack.push(value); 
        while(tmpstack.size() > 0) 
            stack.push(tmpstack.pop()); 
        }

Метод в основном классе

public class Main {
    public static void main(String[] args){
        //Stack
        System.out.println("Starting to print the value of the stack:");
        Stack s = new Stack();
        for (int i = 0; i < 12; i++) {
            Node node = new Node();
            node.changeValue((i+1));
            s.push(node);
        }
        s.printStack();
        s.insertNode(77,5, s); //value, position, stack
        s.printStack();

1 Ответ

0 голосов
/ 27 сентября 2019

Скорее всего, проблема в вашем Stack классе:

public Node[] stackList = new Node[12];

У вас есть жесткое ограничение в 12 единиц на количество предметов, которые вы можете положить в свой стек.

Ваша основная программа добавляет 12 элементов, печатает стопку, а затем пытается вставить элемент.В вашем методе push у вас есть это:

public void push(Node node){ //Adds nodes to the top of the stack.
    stackList[index] = node; 
    if (index < (stackList.length - 1)){ 
        index++;
    }
}

После того, как вы добавили 12 элементов в стек, index будет равен 12. Итак, первая строка кода, stackList[index] = node;, пытается обновить stackList[12].Это за пределами массива (допустимые индексы от 0 до 11).

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

...