es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pasando una pila a una función

Estoy intentando resolver una pregunta en HackerRank. Pero siempre recibo una excepción emptyStack. Creo que puede ser porque estoy pasando la pila a la función getMax y está cambiando la pila original. Intenté escribir esto en getMax con la esperanza de que no afecte la pila final, pero no funcionó.

Stack<Integer> s=st;

¿Puedes señalar y explicar el error que estoy cometiendo?

  • El programa funciona perfectamente bien para algunos casos de prueba.(0,2,27)
  • Enlace de la pregunta: https://www.hackerrank.com/challenges/maximum-element/copy-from/243724938
  • Mi solución:

    import java.util.*;
    class Solution
    {
    static void getMax(Stack st)
    {
    Stack s=st;
    int max=s.peek();
    s.pop();
    while(!s.empty())
    {
    if(s.peek()>max)
    max=s.peek();
    s.pop();
    }
    System.out.println(max);
    }
    public static void main(String args[])
    {
    Stack s=new Stack();
    Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();
    while(n–>0)
    {
    int c=sc.nextInt();
    if(c==1)
    s.push(sc.nextInt());
    else if(c==2)
    s.pop();
    else
    getMax(s);
    }
    }
    }

ONE OF ERROR GIVING TEST CASE

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El error que estás cometiendo es que estás pasando la referencia de la pila original a la función getMax. Cuando haces esto, cualquier operación que realices en la pila dentro de la función getMax se reflejará en la pila original. En tu caso, estás sacando elementos de la pila dentro de getMax, por lo que estás obteniendo una excepción de pila vacía.

    Para solucionar esto, debes crear una nueva pila dentro de la función getMax y copiar el contenido de la pila original en ella. Puedes hacer esto utilizando un bucle y el método push de la pila. De esta manera, cualquier operación que realices en la nueva pila dentro de getMax no afectará la pila original.

    Aquí te mostramos cómo puedes modificar tu función getMax para crear una nueva pila:

    static void getMax(Stack<integer> st)
    {
        Stack<integer> s = new Stack<integer>();
        s.addAll(st); // utiliza el método addAll para copiar elementos
        int max = s.peek();
        s.pop();
        while(!s.empty())
        {
            if(s.peek() > max)
                max = s.peek();
            s.pop();       
        }
        System.out.println(max);
    }
    

    Con esta modificación, tu programa debería funcionar correctamente para todos los casos de prueba, incluidos los que antes daban una excepción de pila vacía.

Comments are closed.