7 IMPLEMENTACION : pilas
\r
9 ALMACENAMIENTO : CURSORES
\r
11 MODIFICADO PARA QUE COMPILE, y un par de errores que tenia (estan marcados)
\r
17 { ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }
\r
23 { usa las funciones generales de TDAs }
\r
29 { maximo tamano del cursor }
\r
31 const PILAC_MAX_CURSOR = 100;
\r
35 { tipos propios de la lista para definir el cursor }
\r
39 PILAC_puntero = integer;
\r
45 PILAC_nulo : PILAC_puntero = 0;
\r
57 Sig : PILAC_puntero;
\r
65 { ahora le toca definir el cursor }
\r
67 PILAC_Almac = record
\r
69 almacenamiento : array [ 1 .. PILAC_MAX_CURSOR ] of PILAC_Nodo;
\r
71 siguientes : array [ 1 .. PILAC_MAX_CURSOR ] of PILAC_Puntero;
\r
73 primero_dispo : PILAC_puntero;
\r
83 almac : PILAC_Almac;
\r
85 primero: PILAC_puntero;
\r
101 PROCEDURE PILAC_Inicializar ( VAR l: PILAC_Pila );
\r
103 FUNCTION PILAC_vacio( l: PILAC_Pila): BOOLEAN;
\r
105 FUNCTION PILAC_lleno( l: PILAC_Pila): BOOLEAN;
\r
109 PROCEDURE PILAC_poner ( VAR l: PILAC_Pila; VAR e: Tipo_Elem );
\r
111 PROCEDURE PILAC_sacar ( VAR l: PILAC_Pila; VAR e: Tipo_Elem);
\r
113 PROCEDURE PILAC_vaciar ( VAR l: PILAC_Pila );
\r
115 PROCEDURE PILAC_copiar ( a: PILAC_Pila; VAR b: PILAC_Pila );
\r
123 { CURSORES DE ESTA IMPLEMENTACION }
\r
125 { ========================================================================== }
\r
127 { inicializar el almacenamiento }
\r
129 { PRE : 'almac' no esta inicializado }
\r
131 { POST: 'almac' esta inicializado y vacio }
\r
133 procedure PILAC_Almac_Inicializar( VAR almac : PILAC_Almac );
\r
135 var i : PILAC_Puntero;
\r
139 almac.primero_dispo := 1;
\r
141 for i := 1 to PILAC_MAX_CURSOR - 1 do
\r
145 almac.siguientes[i] := i + 1;
\r
149 almac.siguientes[PILAC_MAX_CURSOR] := PILAC_Nulo;
\r
155 { ========================================================================== }
\r
157 { saber si hay lugar para reservar un nuevo elemento en el almacenamiento }
\r
159 { PRE : 'almac' esta inicializado }
\r
161 { POST: si hay lugar en 'almac' para un nuevo elemento,
\r
163 entonces retorna TRUE y sino FALSE }
\r
164 {ANDABA AL REVES, CORREGIDO}
\r
167 function PILAC_Almac_HayLugar( almac : PILAC_Almac ): boolean;
\r
171 PILAC_Almac_HayLugar := NOT (almac.primero_dispo = PILAC_Nulo);
\r
177 { ========================================================================== }
\r
179 { el pedido de un nuevo elemento al almacenamiento }
\r
181 { PRE : 'almac' esta inicializado }
\r
183 { POST: si hay lugar en 'almac' para un nuevo elemento,
\r
185 entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento
\r
187 sino 'puntero' tiene el valor TTDA_Nulo }
\r
189 procedure PILAC_Almac_Reservar( VAR almac : PILAC_Almac; VAR puntero : PILAC_Puntero );
\r
193 if not PILAC_Almac_HayLugar( almac )
\r
197 puntero := PILAC_Nulo
\r
201 puntero := almac.primero_dispo;
\r
203 almac.primero_dispo := almac.siguientes[ puntero ];
\r
211 { ========================================================================== }
\r
213 { liberar un elemento del almacenamiento }
\r
215 { PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }
\r
217 { POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }
\r
219 procedure PILAC_Almac_Liberar( VAR almac : PILAC_Almac; VAR puntero : PILAC_Puntero );
\r
223 almac.siguientes[ puntero ] := almac.primero_dispo;
\r
225 almac.primero_dispo := puntero;
\r
227 puntero := PILAC_Nulo;
\r
233 { ========================================================================== }
\r
235 { acceder al elemento del almacenamiento apuntado por un puntero }
\r
237 { PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }
\r
239 { POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }
\r
241 procedure PILAC_Almac_Acceder( almac : PilaC_Almac; puntero : PILAC_Puntero; VAR elemento : PILAC_Nodo );
\r
245 elemento := almac.almacenamiento[ puntero ];
\r
251 { ========================================================================== }
\r
253 { modificar el elemento del almacenamiento apuntado por un puntero }
\r
255 { PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }
\r
257 { POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }
\r
259 procedure PILAC_Almac_Modificar( VAR almac : PILAC_Almac; puntero : PILAC_Puntero; elemento : PILAC_Nodo );
\r
263 almac.almacenamiento[ puntero ] := elemento;
\r
273 { Estas son los dos procedimientos principales de la aplicaciĆ³n }
\r
277 PROCEDURE PILAC_Inicializar ( VAR l: PILAC_Pila );
\r
281 PILAC_Almac_Inicializar( l.almac );
\r
283 l.primero := PILAC_Nulo;
\r
289 FUNCTION PILAC_vacio( l: PILAC_Pila): BOOLEAN;
\r
293 PILAC_vacio := ( l.Primero = PILAC_Nulo);
\r
299 FUNCTION PILAC_lleno( l: PILAC_Pila): BOOLEAN;
\r
303 PILAC_lleno := not PILAC_Almac_HayLugar( l.almac );
\r
309 PROCEDURE PILAC_poner ( VAR l: PILAC_Pila; var e: Tipo_Elem);
\r
321 n.sig := l.primero;
\r
323 PILAC_Almac_Reservar( l.almac, np );
\r
325 PILAC_Almac_Modificar( l.almac, np, n );
\r
333 { pre: no esta vacia }
\r
335 PROCEDURE PILAC_sacar ( VAR l: PILAC_Pila; VAR e: Tipo_Elem);
\r
337 VAR n : PILAC_Nodo;
\r
341 tmpp: PILAC_Puntero;
\r
345 PILAC_Almac_Acceder( l.almac, l.primero, n );
\r
347 PILAC_Almac_Liberar( l.almac, l.primero );
\r
349 l.primero := n.Sig;
\r
353 { y se lo asigno al parametro }
\r
361 PROCEDURE PILAC_vaciar ( VAR l: PILAC_Pila );
\r
363 VAR np : PILAC_Puntero;
\r
371 while( np <> PILAC_Nulo ) do begin
\r
373 PILAC_Almac_Acceder( l.almac, np, n );
\r
375 PILAC_Almac_Liberar( l.almac, np );
\r
381 l.primero := PILAC_Nulo;
\r
387 { pre: 'a' y 'b' estan creadas y 'b' esta vacia }
\r
389 { POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }
\r
391 PROCEDURE PILAC_copiar ( a : PILAC_Pila; VAR b : PILAC_Pila );
\r
393 VAR np, mp, tmpp : PILAC_Puntero;
\r
399 if a.primero = PILAC_Nulo then exit;
\r
403 PILAC_Almac_Acceder( a.almac, np, n );
\r
407 PILAC_Almac_Reservar( b.almac, mp );
\r
415 while( n.sig <> PILAC_Nulo ) do begin
\r
419 PILAC_Almac_Reservar( b.almac, tmpp );
\r
423 PILAC_Almac_Modificar( b.almac, mp, m );
\r
429 PILAC_Almac_Acceder( a.almac, np, n );
\r
441 m.sig := PILAC_Nulo;
\r
443 PILAC_Almac_Modificar( b.almac, mp, m );
\r