Está en la página 1de 22

Estructuras de Datos

Stacks (Pilas)

 El tipo de datos abstracto Stack


 Implementación con arreglos
 Implementación con nodos enlazados
Objetivo
Utilizar la memoria dinámica de forma eficiente por medio de la
Implementación de pilas.

2
Estructuras de Datos

Stacks (Pilas)

 El tipo de datos abstracto Stack


 Implementación con arreglos
 Implementación con nodos enlazados
El TDA Stack (Pila)

Una pila de platos en la cafetería 4

11
El TDA Stack (Pila)
• Un número finito de objetos
• No necesariamente distintos (pueden haber repetidos)
• Tienen el mismo tipo de datos
• LIFO (last in, first out: último en entrar, primero en salir)

Operaciones
• isEmpty(): ¿está el stack vacío?
• push(newEntry): agregar newEntry al stack
• pop(): remover el elemento agregado más recientemente
• peek(): consultar el elemento agregado más
recientemente

• http://www.cs.armstrong.edu/liang/animation/web/Stack.
html

6
Estructuras de Datos

Stacks (Pilas)

 El tipo de datos abstracto Stack


 Implementación con arreglos
 Implementación con nodos enlazados
Implementación de un stack con un array

Uso de un array para guardar las entradas de un stack:


(a) un boceto preliminar
(b) Detalles de implementación 8
Implementación de un stack con un array
• Stack de capacidad fija (número de elementos del array).
• Defina el stack como un struct
• Campos del struct:
 Un arreglo items[MAX_STACK] de tipo stackType (use typedef) con
capacidad para MAX_STACK elementos
 El índice top que corresponde al último elemento agregado

• El Stack sólo permite acceder al último elemento, si necesita acceder


a cualquier elemento, no use un stack
9
Desbordamiento y subdesbordamiento
1. ¿Qué pasa si se trata de agregar elementos (push) a un stack
lleno?

2. ¿Y si se trata de remover elementos (pop) de un stack vacío?

Al primer caso se le conoce como desbordamiento de pila (stack


overflow) y, al segundo, como subdesbordamiento (underflow)

10
Para prevenir estas situaciones, se usará la macro assert, de la
biblioteca <assert.h>. Esta macro verifica que se cumpla una
condición; de no ser así, finaliza el programa con un mensaje de error.

11
Implementación de un stack con un array
stack.h

12
Implementación de un stack con un array
stack_array.c (parte 2)
1/

13
Implementación de un stack con un array
stack_array.c (parte 2/2)

14
Estructuras de Datos

Stacks (Pilas)

 El tipo de datos abstracto Stack


 Implementación con arreglos
 Implementación con nodos enlazados
Implementación de un stack: nodos enlazados
• Una implementación basada en nodos enlazados stack

• permite al stack crecer y reducirse dinámicamente

• El stack es un puntero a la cabecera de una lista


enlazada de ítems

• Las operaciones del stack deben reservar y liberar


la memoria manualmente

16
Implementación de un stack: nodos enlazados
stack_linked.h (parte 1/2)

El uso de #ifndef previene que un archivo de cabecera se incluya más de una vez 17
Implementación de un stack: nodos enlazados
stack_linked.h (parte 2/2)

18
Implementación de un stack: nodos enlazados
stack_linked.c (parte 1/3)

19
Implementación de un stack: nodos enlazados
stack_linked.c (parte 2/3)

20
Implementación de un stack: nodos enlazados
stack_linked.c (parte 3/3)

21
En resumen
• Stacks (pilas) son TDAs que aplican el principio LIFO

• Se pueden implementar con arrays o con nodos enlazados

• Las operaciones que se pueden realizar en un stack son:


• Agregar un elemento en la parte superior del stack (push)
• Remover un elemento de la parte superior del stack (pop)
• Consultar el elemento en la parte superior del stack (peek)
• Verificar si el stack está vacío (isEmpty)

• Se estudiaron dos aplicaciones de los stacks a expresiones


22

También podría gustarte