• No results found

Charitable Distributions Do Not Create Procedural

In document Saving Charitable Settlements (Page 34-39)

C. Collusion and Procedural Concerns Are Unfounded

2. Charitable Distributions Do Not Create Procedural

El desempeño de una pila implantada mediante un arreglo es tan excelente que vale la pena hacer explícito el mecanismo de implantación.

ArrayStack<T> dispara excepciones cuando se excede la capacidad del arreglo o cuando se intenta acceder el tope de una pila vacía. Disparar estas excepciones tiene un ligero coste en desempeño que puede ser importante si la pila se utiliza muy a menudo. Existen muchas aplicaciones en las cuales se puede conocer el tamaño máximo de la pila y en las que es innecesario considerar el desborde. Por otra parte, un desborde negativo es un error de programación a vericar en las primeras etapas de un proyecto. Por esa razón, el TAD FixedStack<T> modeliza las mismas primitivas que ArrayStack<T> con la diferencia de que no se efectúan vericaciones y no se disparan excepciones. De esta manera, aplicaciones que conozcan el máximo tamaño de pila se benecian de la ganancia en velocidad dada por la ausencia de vericaciones.

Pilas implantadas con arreglos se denen en el archivo htpl_arrayStack.H 101ai, el

cual exporta dos tipos principales: ArrayStack<T> y FixedStack<T>: 101a htpl_arrayStack.H101ai≡

template <typename T, const size_t dim = 100> class ArrayStack {

hmiembros privados de pila vectorizada 101bi hmiembros públicos de ArrayStack<T> 101ci

};

template <typename T, const size_t dim = 100> class FixedStack

Denes:

ArrayStack, used in chunks 101c, 110, 118e, 24648, and 509b. FixedStack, used in chunks 180c, 473b, and 492b.

Los dos tipos de datos poseen los mismos atributos; éstos son:

101b hmiembros privados de pila vectorizada101bi≡ (101a)

T array[dim];

size_t head;

array es un arreglo estático de elementos de tipo T con dimensión dim. dim es un parámetro de la plantilla que representa la dimensión del arreglo y con un valor por omisión de 100. head es el índice de la próxima entrada disponible. También indica la cantidad de elementos de la pila. head - 1 es el índice del elemento tope.

La construcción de una pila sólo requiere inicializar head:

101c hmiembros públicos de ArrayStack<T>101ci≡ (101a) 101d .

ArrayStack() : head(0) { /* empty */ }

Uses ArrayStack 101a.

Para insertar un elemento se usa el método push():

101d hmiembros públicos de ArrayStack<T>101ci+≡ (101a) / 101c 102a .

T & push(const T & data) {

hpush data 101ei

}

101e hpush data 101ei≡ (101d)

array[head++] = data; return array[head - 1];

En algunas aplicaciones se requiere apartar espacio en la pila sin que aún se conozcan los valores de inserción. Si bien esto puede lograrse mediante una serie consecutiva de pushes de datos vacíos, es más eciente ofrecer una sola operación. Tal operación se denomina pushn() y se implanta como sigue:

102a hmiembros públicos de ArrayStack<T> 101ci+≡ (101a) / 101d 102c .

T & pushn(const size_t & n = 1) {

hapartar n elementos102bi

}

A partir del tope, el usuario de ArrayStack<T> puede referenciar a los n elementos insertados que no han sido inicializados y así asignarles su valor cuando sea necesario.

hapartar n elementos102bi es muy simple con un arreglo; basta con incrementar head:

102b hapartar n elementos 102bi≡ (102a)

head += n;

return array[head - 1];

Para sacar un elemento de la pila utilizamos pop():

102c hmiembros públicos de ArrayStack<T> 101ci+≡ (101a) / 102a 102e .

T pop() { hpop data 102di } 102d hpop data 102di≡ (102c) return array[head];

Por razones de eciencia, también es deseable ofrecer una primitiva que libere varios elementos en una sola operación:

102e hmiembros públicos de ArrayStack<T> 101ci+≡ (101a) / 102c 102g .

T popn(const int & n) {

hliberar n elementos102fi }

En algunos contextos, a esta operación se le llama multipop.

102f hliberar n elementos 102fi≡ (102e)

head -= n;

return array[head];

Hay varias formas de consultar la pila; todas se efectúan respecto al tope y retornan una referencia a un elemento dentro de la pila. La primera forma es la del elemento en el tope:

102g hmiembros públicos de ArrayStack<T> 101ci+≡ (101a) / 102e 103a .

T & top() {

hretornar referencia al tope102hi }

102h hretornar referencia al tope 102hi≡ (102g)

Otro tipo de consulta, menos frecuente pero posible en algunas aplicaciones, es conocer el i-ésimo elemento respecto al tope:

103a hmiembros públicos de ArrayStack<T>101ci+ (101a) / 102g 103d .

T & top(const int & i) {

hreferencia al i-ésimo respecto a tope 103bi }

Una vez validado el rango de acceso, el elemento es accedido mediante:

103b hreferencia al i-ésimo respecto a tope103bi (103a)

return array[head - i - 1];

En algunas ocasiones una pila es reutilizable a condición de que ésta sea previamente vaciada. Vaciar la pila implantada con un arreglo es una operación extremadamente rápida:

103c hvaciar pila103ci≡ (103d)

head = 0;

Esta facilidad merece ofrecerse en una primitiva:

103d hmiembros públicos de ArrayStack<T>101ci+ (101a) / 103a 103e .

void empty() { hvaciar pila 103ci }

Podemos consultar un predicado que nos diga si la pila está o no vacía: 103e hmiembros públicos de ArrayStack<T>101ci+≡ (101a) / 103d 103g .

bool is_empty() const { hpila vacía?103fi }

103f hpila vacía? 103fi≡ (103e)

return head == 0;

La cantidad de elementos de la pila es directamente el valor de head: 103g hmiembros públicos de ArrayStack<T>101ci+ (101a) / 103e

const size_t & size() const { return head; }

A nivel de interfaz, FixedStack<T> es idéntica a ArrayStack<T>. Por razones de compatibilidad es preferible denir las mismas excepciones de ArrayStack<T> en las primitivas de FixedStack<T>. De este modo, FixedStack<T> es aplicable en cada sitio donde se utilice ArrayStack<T>.

A nivel de implantación, FixedStack<T> es muy similar a ArrayStack<T>. La di- ferencia principal reside en que FixedStack<T> no efectúa vericación de desborde ni dispara excepciones. De resto, cada primitiva de FixedStack<T> es idéntica a su par en ArrayStack<T>.

In document Saving Charitable Settlements (Page 34-39)

Related documents