Pregunta

Necesito llenar una pila a partir de una matriz, luego imprimir los elementos en orden y luego invertir el orden nuevamente.Lo que tengo problemas es que recibo una excepción ArrayIndexOutOfBoundsException y no puedo entender de dónde viene.Intenté ejecutar la depuración y parece que, cuando estoy eliminando elementos, nunca llega al último elemento.A continuación se muestra mi código:

public class arrayStack {

    private int top;
    private String[] storage;

    public arrayStack(int capacity)
    {
        storage = new String[capacity];
        top = -1;
    }

    public boolean isEmpty() {
        return (top == 0);
    }

    String peek() {
        return storage[top];    
    }

    String pop() {
        top--;
        return storage[top];
    }

    public void push(String str) {
        top++;
        storage[top] = str;
    }

}

PilaMain.java:

public class StackMain {

    public static void main(String[] args) {
        //int j = 5;
        String[] list = new String[5];

        list[0] = "Beware";
        list[1] = "The";
        list[2] = "Ides";
        list[3] = "Of";
        list[4] = "March";

        arrayStack stack = new arrayStack(5);

        for(int i = 0; i < list.length; i++)
        {
            stack.push(list[i]);
        }

        for(int j = 0; j < list.length; j++)
            System.out.println(stack.pop());

    }

}
¿Fue útil?

Solución

En pop(), debe devolver el elemento que se extrajo, que es el elemento en el índice del valor anterior de top.La forma más limpia es cambiar la función a

String pop() {
    return storage[top--];
}

Editar
También necesitas cambiar isEmpty() a return (top == -1).También puede cambiar la implementación para usar size (el número de elementos) en lugar de top (el índice del elemento más alto) como otros mencionados.

Otros consejos

En tu constructor para arrayStack, deberías configurar top a 0, en lugar de a -1.En tus isEmpty método, incluso compruebas que top == 0, tan claramente top == 0 significa vacío, en lugar de top == -1.Es por eso que siempre se omite el último elemento cuando se extraen valores de la pila;poniendo los incrementos del primer elemento top a 0.

Ah, y me perdí lo que dijo Tom, a continuación:decreciente top antes de encontrar el valor en la parte superior devolverá el elemento incorrecto.Es preferible el siguiente código, pero podría ser más fácil de entender para un principiante:

public String pop() {
    String topValue = storage[top];
    top--;
    return topValue;
}

Si usted push(String) solo un elemento, con top inicializado en -1, ¿cuál será el valor de top después del envío?

Ahora mira tu pop() función, disminuye la parte superior antes tratando de obtener el elemento solicitado, entonces, ¿a qué índice de matriz intentará acceder si ha presionado solo un elemento?

desde que empezaste top en -1, una vez que haya agregado sus 5 elementos de la matriz String top será 4, lo cual es incorrecto ya que tienes 5 elementos.

Luego, cuando intentas hacer estallar la pila 5 veces, top vuelve a -1 y storage[-1] no existe entonces obtienes un ArrayIndexOutOfBoundsException

Comenzar top a las 0.

Alternativamente si disminuyes top después de recuperar el elemento de su pila, no obtendrá un error;pero sería mejor empezar top en 0 porque top realmente representa la cantidad de elementos en su pila.

Por favor etiquete la pregunta como tarea.Y llegando al problema, el problema está en la función pop().Primero está disminuyendo el valor de top y luego devolviendo el elemento.Pero cuando marca la función push(), primero incrementa y luego agrega el elemento.Entonces, si mueves el top-- Después de obtener el elemento de la pila, su problema estará resuelto.

Su método POP es incorrecto.En su código aquí, los primeros comienzan en negativo 1.

Cuando presionas un elemento, la parte superior se convierte en 0. Cuando envíe un elemento, la parte superior se convierte en -1 antes de acceder al elemento.

Además, su método vacío es incorrecto.En el estado inicial de la pila, los controles TOP= -1, y ISEMPTY si devuelven 0. Inicialmente, la pila debe estar vacía.

Se debe cambiar su función POP ().Debe almacenar el almacenamiento [POP] en una variable temporal y luego reducir la parte superior por 1 y luego devolver la variable temporal

Sería genial si puede incluir la facilidad de genéricos de Java 1.5 para implementar la pila. Entonces, su pila será más flexible. Puede contener cualquier tipo de objetos (en su caso solo cadenas) Y un consejo más está en el método POP, debe indicar que el recolector de basura deseche el objeto que se explica de la siguiente manera.(En el caso, si está utilizando genéricos), es una implementación de pila más flexible que se menciona en Efectiva Edición Java 2.

// Initial attempt to generify Stack = won’t compile!
public class Stack<E> {
private E[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack() {
elements = (E[])new E[DEFAULT_INITIAL_CAPACITY];
}
public void push(E e) {
ensureCapacity();
elements[size++] = e;
}
public E pop() {
if (size==0)
throw new EmptyStackException();
E result = elements[--size];
elements[size] = null; // Eliminate obsolete reference
return result;
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top