4 IMPLEMENTACION : pilas
\r
6 ALMACENAMIENTO : CURSORES
\r
11 { ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }
\r
15 { usa las funciones generales de TDAs }
\r
19 { maximo tamano del cursor }
\r
21 PILAC_MAX_CURSOR = 100;
\r
23 { tipos propios de la lista para definir el cursor }
\r
25 PILAC_puntero = integer;
\r
28 PILAC_nulo : PILAC_puntero = 0;
\r
33 Sig : PILAC_puntero;
\r
36 { ahora le toca definir el cursor }
\r
37 PILAC_Almac = record
\r
38 almacenamiento : array [ 1 .. PILAC_MAX_CURSOR ] of PILAC_Nodo;
\r
39 siguientes : array [ 1 .. PILAC_MAX_CURSOR ] of PILAC_Puntero;
\r
40 primero_dispo : PILAC_puntero;
\r
44 almac : PILAC_Almac;
\r
45 primero: PILAC_puntero;
\r
52 PROCEDURE PILAC_Inicializar( VAR l: T_PILAC );
\r
53 FUNCTION PILAC_vacio( l: T_PILAC): BOOLEAN;
\r
54 FUNCTION PILAC_lleno( l: T_PILAC): BOOLEAN;
\r
55 PROCEDURE PILAC_poner( VAR l: T_PILAC; VAR e: T_REGISTRO );
\r
56 PROCEDURE PILAC_sacar( VAR l: T_PILAC; VAR e: T_REGISTRO);
\r
57 PROCEDURE PILAC_vaciar( VAR l: T_PILAC );
\r
58 PROCEDURE PILAC_copiar( a: T_PILAC; VAR b: T_PILAC );
\r
63 { CURSORES DE ESTA IMPLEMENTACION }
\r
64 { ========================================================================== }
\r
65 { inicializar el almacenamiento }
\r
66 { PRE : 'almac' no esta inicializado }
\r
67 { POST: 'almac' esta inicializado y vacio }
\r
69 procedure PILAC_Almac_Inicializar( VAR almac : PILAC_Almac );
\r
74 almac.primero_dispo := 1;
\r
75 for i := 1 to PILAC_MAX_CURSOR - 1 do
\r
77 almac.siguientes[i] := i + 1;
\r
79 almac.siguientes[PILAC_MAX_CURSOR] := PILAC_Nulo;
\r
82 { ========================================================================== }
\r
83 { saber si hay lugar para reservar un nuevo elemento en el almacenamiento }
\r
84 { PRE : 'almac' esta inicializado }
\r
85 { POST: si hay lugar en 'almac' para un nuevo elemento,
\r
86 entonces retorna TRUE y sino FALSE }
\r
87 function PILAC_Almac_HayLugar( almac : PILAC_Almac ): boolean;
\r
89 PILAC_Almac_HayLugar := not ( almac.primero_dispo = PILAC_Nulo );
\r
92 { ========================================================================== }
\r
93 { el pedido de un nuevo elemento al almacenamiento }
\r
94 { PRE : 'almac' esta inicializado }
\r
95 { POST: si hay lugar en 'almac' para un nuevo elemento,
\r
96 entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento
\r
97 sino 'puntero' tiene el valor TTDA_Nulo }
\r
98 procedure PILAC_Almac_Reservar( VAR almac : PILAC_Almac; VAR puntero : PILAC_Puntero );
\r
100 if not PILAC_Almac_HayLugar( almac )
\r
102 puntero := PILAC_Nulo
\r
104 puntero := almac.primero_dispo;
\r
105 almac.primero_dispo := almac.siguientes[ puntero ];
\r
109 { ========================================================================== }
\r
110 { liberar un elemento del almacenamiento }
\r
111 { PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }
\r
112 { POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }
\r
113 procedure PILAC_Almac_Liberar( VAR almac : PILAC_Almac; VAR puntero : PILAC_Puntero );
\r
115 almac.siguientes[ puntero ] := almac.primero_dispo;
\r
116 almac.primero_dispo := puntero;
\r
117 puntero := PILAC_Nulo;
\r
120 { ========================================================================== }
\r
121 { acceder al elemento del almacenamiento apuntado por un puntero }
\r
122 { PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }
\r
123 { POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }
\r
124 procedure PILAC_Almac_Acceder( almac : PilaC_Almac; puntero : PILAC_Puntero; VAR elemento : PILAC_Nodo );
\r
126 elemento := almac.almacenamiento[ puntero ];
\r
129 { ========================================================================== }
\r
130 { modificar el elemento del almacenamiento apuntado por un puntero }
\r
131 { PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }
\r
132 { POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }
\r
133 procedure PILAC_Almac_Modificar( VAR almac : PILAC_Almac; puntero : PILAC_Puntero; elemento : PILAC_Nodo );
\r
135 almac.almacenamiento[ puntero ] := elemento;
\r
138 { Estas son los dos procedimientos principales de la aplicación }
\r
139 PROCEDURE PILAC_Inicializar ( VAR l: T_PILAC );
\r
141 PILAC_Almac_Inicializar( l.almac );
\r
142 l.primero := PILAC_Nulo;
\r
145 FUNCTION PILAC_vacio( l: T_PILAC): BOOLEAN;
\r
147 PILAC_vacio := ( l.Primero = PILAC_Nulo);
\r
150 FUNCTION PILAC_lleno( l: T_PILAC): BOOLEAN;
\r
152 PILAC_lleno := not PILAC_Almac_HayLugar( l.almac );
\r
155 PROCEDURE PILAC_poner ( VAR l: T_PILAC; var e: T_REGISTRO);
\r
162 n.sig := l.primero;
\r
163 PILAC_Almac_Reservar( l.almac, np );
\r
164 PILAC_Almac_Modificar( l.almac, np, n );
\r
168 { pre: no esta vacia }
\r
169 PROCEDURE PILAC_sacar ( VAR l: T_PILAC; VAR e: T_REGISTRO);
\r
173 tmpp: PILAC_Puntero;
\r
176 PILAC_Almac_Acceder( l.almac, l.primero, n );
\r
177 PILAC_Almac_Liberar( l.almac, l.primero );
\r
178 l.primero := n.Sig;
\r
179 { y se lo asigno al parametro }
\r
183 PROCEDURE PILAC_vaciar ( VAR l: T_PILAC );
\r
185 np : PILAC_Puntero;
\r
190 while( np <> PILAC_Nulo ) do begin
\r
191 PILAC_Almac_Acceder( l.almac, np, n );
\r
192 PILAC_Almac_Liberar( l.almac, np );
\r
195 l.primero := PILAC_Nulo;
\r
198 { pre: 'a' y 'b' estan creadas y 'b' esta vacia }
\r
199 { POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }
\r
200 PROCEDURE PILAC_copiar ( a : T_PILAC; VAR b : T_PILAC );
\r
202 np, mp, tmpp : PILAC_Puntero;
\r
206 if a.primero = PILAC_Nulo then exit;
\r
208 PILAC_Almac_Acceder( a.almac, np, n );
\r
209 PILAC_Almac_Reservar( b.almac, mp );
\r
212 while( n.sig <> PILAC_Nulo ) do begin
\r
213 PILAC_Almac_Reservar( b.almac, tmpp );
\r
215 PILAC_Almac_Modificar( b.almac, mp, m );
\r
217 PILAC_Almac_Acceder( a.almac, np, n );
\r
221 m.sig := PILAC_Nulo;
\r
222 PILAC_Almac_Modificar( b.almac, mp, m );
\r