[ Foro de Pascal ]

Pila dinamica

15-May-2014 00:19
Invitado (Florencia)
3 Respuestas

Hola, estoy teniendo un problemita con el procedimiento para eliminar un elemento de la pila y no me doy cuenta cual es. Este seria el codigo que tengo:


UNIT TDA_PILA_DIN;
INTERFACE

USES crt;

TYPE
	tPunteroPila=^tNodoPila;
	tDatoPila=integer;
	tNodoPila=record
				info:tDatoPila;
				sig:tPunteroPila;
			end;
	tPila=record
			tope:tPunteroPila;
			tam:cardinal;
		end;
		
PROCEDURE crearPila(var p:tPila);			
PROCEDURE eliminarPila(var p:tPila;var x:tDatoPila);	
	
	
IMPLEMENTATION

PROCEDURE crearPila(var p:tPila);
BEGIN
	p.tope:=nil;
	p.tam:=0;
END;			
	
PROCEDURE eliminarPila(var p:tPila;var x:tDatoPila);
VAR
	aux:tPunteroPila;
BEGIN
	x:=p^.info;
	aux:=p^.sig;
	p:=p^.sig;
	dec(p.tam);
        dispose(aux);
END;
		
END.



15-May-2014 00:43
Nacho Cabanes (+84)

Te falta el método "Apilar", para que veamos cómo la estás implementando. Si no hay datos añadidos, no podrás borrar. A ojo, si la pila crece "hacia arriba", yo diría que el "Dispose" lo tienes que hacer de "p", no de "p^.sig", pero no te lo puedo asegurar sin ver cómo guardas los datos nuevos.


15-May-2014 00:52
Invitado (Florencia)

el insertar es asi


PROCEDURE insertarPila(var p:tPila;x:tDatoPila);
VAR
	aux:tPunteroPila;
BEGIN
	new(aux);
	aux^.sig:=p.tope;
	aux^.info:=x;
	p.tope:=aux;
	inc(p.tam);
END;


se me ocurrio algo asi ahora el elimnarPila, me compila bien este:


PROCEDURE eliminarPila(var p:tPila;var x:tDatoPila);
VAR
	aux:tPunteroPila;
BEGIN
	aux:=p.tope;
	p.tope:=aux^.sig;
	x:=aux^.info;
	dec(p.tam);
    dispose(aux);
END;


otra cosa, es posible de alguna manera determinar que no se puedan insertar mas elementos?


16-May-2014 00:55
Nacho Cabanes (+84)

Veo que lo haces de la "forma natural": al añadir, el nuevo dato pasa a ser el "tope" de la pila, y, al no usar clases, devuelves ese nuevo tope como valor por referencia.  Aun así, veo que guardáis en otro dato tanto el tope como el tamaño, y ambas cosas se podrían evitar, pero supondré que os piden hacerlo así.

Entonces el eliminar debería ser bastante parecido a insertar: memorizas el valor a devolver y el puntero a borrar, avanzas en la estructura dinámica, disminuyes el contador, liberas el espacio ocupado, y sales devolviendo los datos que habías memorizado. Tu forma de hacerlo parece perfecta. Personalmente, prefiero nombres un poco más explicativos que "aux", y lo ordenaría de forma distinta, pero verás que se trata exactamente del mismo fuente:


PROCEDURE eliminarPila(var p:tPila;var x:tDatoPila);
VAR
        nodoABorrar:tPunteroPila;
BEGIN
        nodoABorrar := p.tope;  { Memorizo el nodo a borrar }
        x:=p.tope^.info; { Y el dato a devolver }
        p.tope:=p.tope^.sig;  { Avanzo a la siguiente posición }
        dec(p.tam); { Disminuyo tamaño }
        dispose(nodoABorrar); { Y libero espacio del nodo que ya no se usa }
END;







(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)