6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

15
6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA Definición: Son aquellas que solo tiene 2 operaciones, Push(Inserción) y Pop(Eliminación) la cual solo se puede efectuar por un extremo llamado Top. Sin Embargo se le pueden aplicar todas las operaciónes al igual que a las listas. 1.- Recorrido Definición: Ya que las pilas son LIFO(Last in - First Out) el Recorrido se hace sacando el ultimo dato que se inserto hasta que no encuentre ningún otro. Detalle: Apuntador toma el Top, después ve si la condición cumple para efectuar un Ciclo mientras Apuntador sea diferente de Nulo, si cumple lo que hace es que despliega el contenido de la Pila(Pila[Apuntador]), después Apuntador se le resta 1. Este proceso se repite hasta que Apuntador sea igual Nulo(Cuando llega a este punto la Pila ya fue Recorrida). Algoritmo: Recorrido(Pila, Top) Apuntador ←- Top Repetir mientras Apuntador ≠ Nulo Imprimir Pila[Apuntador] Apuntador ←- Apuntador - 1 Fin del ciclo Salir Diagrama:

Transcript of 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

Page 1: 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

Definición:

Son aquellas que solo tiene 2 operaciones, Push(Inserción) y Pop(Eliminación) la cual solo se puede efectuar por un extremo llamado Top. Sin Embargo se le pueden aplicar todas las operaciónes al igual que a las listas.

1.- Recorrido

Definición:

Ya que las pilas son LIFO(Last in - First Out) el Recorrido se hace sacando el ultimo dato que se inserto hasta que no encuentre ningún otro.

Detalle:

Apuntador toma el Top, después ve si la condición cumple para efectuar un Ciclo mientras Apuntador sea diferente de Nulo, si cumple lo que hace es que despliega el contenido de la Pila(Pila[Apuntador]), después Apuntador se le resta 1. Este proceso se repite hasta que Apuntador sea igual Nulo(Cuando llega a este punto la Pila ya fue Recorrida).

Algoritmo:

Recorrido(Pila, Top)

Apuntador ←- Top

Repetir mientras Apuntador ≠ Nulo

Imprimir Pila[Apuntador]

Apuntador ←- Apuntador - 1

Fin del ciclo

Salir

Diagrama:

Page 2: 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

Corrida:

Push

Definición:

Push es simplemente el método por el cual va agregando un Dato nuevo a la Pila tomando en cuenta la Capacidad Máxima (Max) de almacenar un dato.

Detalle:

Compara en un principio el Top con Max, si la condición no cumple es imposible insertar mas datos a la Pila, de otra forma lo que hace es Incrementar el valor de Top, y copia el valor de Elemento en Pila[Top]. De esta forma el dato ya esta insertado.

Algoritmo:

Push(Pila, Top, Max, Elemento)

Page 3: 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

Si Top ≠ Max

Top ←- Top + 1

Pila[Top] ←- Elemento

Si no:

Imprimir “Pila Llena”

Salir

Diagrama:

Corrida:

Pop

Definición:

Page 4: 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

Pop es simplemente el método por el cual va sacando el ultimo Dato de la Pila, basándose únicamente en el Top.

Detalle:

Compara para determinar si la pila esta vacio, de otra forma lo que hace es Imprimir el valor de Pila[Top] (Que es el dato que esta apunto de Eliminar) y enseguida a Top le resta 1, de esta forma el dato ya no existe.

Algoritmo:

Pop(Pila, Top)

Si Top ≠ Nulo

Imprimir Pila[Top]

Top ←- Top - 1

Si no:

Imprimir “Pila Vacía”

Salir

Diagrama:

Corrida:

Page 5: 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

Búsqueda

Definición:

Este método usa el recorrido para encontrar Elemento y desplegar un mensaje si la búsqueda es exitosa.

Detalle:

El algoritmo compara para determinar si la Pila tiene algún dato, si no simplemente desplegara Lista Vacía y saldrá. De otra manera hará un Recorrido y comparara con cada uno de los Datos de la Pila hasta encontrar el dato que desea buscar. Si lo encuentra desplegara “El Dato fue encontrado” de otra manera “El Dato no se encontró”.

Algoritmo:

Busqueda(Pila, Top, Elemento)

Si Top ≠ Nulo

Apuntador ←- Top

Repetir mientras Apuntador ≠ Nulo

Si Pila[Apuntador] = Elemento

Imprimir “El Dato fue encontrado” y Salir

Apuntador ←- Apuntador - 1

Fin del ciclo

Imprimir “El Dato no se encontró”

Si no:

Imprimir “Pila Vacía”

Salir

Diagrama:

Page 6: 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

Corrida:

Eliminacion

Definición:

Este método busca un Dato dentro de la pila y lo elimina.

Detalle:

El algoritmo compara para determinar si la Pila tiene algún dato, si no simplemente desplegara Pila Vacía y saldrá. De otra manera hará un Recorrido y comparara con cada uno de los Datos de la Pila hasta encontrar el dato que desea eliminar, mientras hace esto copia cada uno de los datos a un arreglo Temp para cuando encuentre el Dato regresar esos valores a la Pila. Si lo encuentra desplegara “Eliminado el Dato” y le restara 1 a Top, de otra manera “El Dato no encontrado”.

Algoritmo:

Page 7: 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

Borrar(Pila, Temp, Top, Elemento)

Si Top ≠ Nulo

Apuntador1 ←- Top

Repetir mientras Apuntador1 ≠ Nulo

Si Pila[Apuntador1] = Elemento

Imprimir “Eliminando el Dato…”

Repetir mientras Apuntador2 ≠ Nulo

Pila[Apuntador1]=Temp[Apuntador2]

Fin del ciclo

Top ←- Top - 1 y Salir

Si No:

Temp[Apuntador2] ←- Pila[Apuntador1]

Apuntador1 ←- Apuntador1 - 1

Apuntador2 ←- Apuntador2 + 1

Fin del ciclo

Imprimir “Dato no encontrado”

Si no:

Imprimir “Pila Vacía”

Salir

Diagrama:

Page 9: 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

PILAS

Una pila representa una estructura lineal de datos en la que se puede agregar o quitar elementos únicamente por uno de los dos extremos. En consecuencia, los elementos de una pila se eliminan en orden inverso al que se insertaron; es decir, el último elemento que se mete en la pila es el primero que se saca. Debido a esta característica, se le conoce como estructura LIFO (Last-Input, First-Output: el ultimo en entrar es el primero en salir).

Existen numerosos casos prácticos en los que se utiliza el concepto de pila; por ejemplo, una pila de platos, una pila de latas en un supermercado, una pila de libros que se exhiben en una librería, etcétera.

Las pilas son estructuras de datos lineales, como los arreglos, ya que los componentes ocupan lugares sucesivos en la estructura y cada uno de ellos tiene un único sucesor y un único predecesor, con excepción del último y del primero, respectivamente. Una pila se define formalmente como una colección de datos a los cuales se puede acceder mediante un extremo,que se conoce generalmente como tope.

 

Representación de pilas

Las pilas no son estructuras fundamentales de datos; es decir, no están definidas como tales en los lenguajes de programación. Para su representación requieren el uso de otras estructuras de datos, como:

Arreglos

Listas

Se utilizaran arreglos. En consecuencia, es importante definir el tamaño máximo de la pila, así como una variable auxiliar a la que se denomina TOPE. Esta variable se utiliza para indicar el último elemento que se inserto en la pila.

Page 10: 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

En la siguiente figura se presentan dos alternativas de representación de una pila, utilizando arreglos.

En la figura F31-3 se presentan ejemplos de a) pila llena, b) pila con algunos elementos y c) pila vacía.

Page 11: 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

Representacion de la pila en lenguajes

Lenguaje C

struct stackNode { /* self-referential struct*/       int data;       struct stackNode *nextPtr;};

Lenguaje C#

public Pila(int n){SP = -1;Max = n - 1;Elemn = new int[n];}

 

Al utilizar arreglos para implementar pilas se tiene la limitación de que se debe reservar espacio de memoria con anticipación, característica propia de los arreglos. Una vez dado un máximo de capacidad a la pila no es posible insertar un número de elementos mayor al máximo establecido.

Si la pila estuviera llena y se intentara insertar un nuevo elemento, se producirá un error conocido como desbordamiento —overflow—. Por ejemplo, si en la pila que se presenta en la figura F31-3 a , donde TOPE = MAX, se quisiera insertar un nuevo elemento, se producirá un error de este tipo. La pila

Page 12: 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

está llena y el espacio de memoria reservado es fijo, no se puede expandir ni contraer.

Una posible solución a este tipo de inconvenientes consiste en definir pilas de gran tamaño, pero esto ultimo resultaría ineficiente y costoso si solo se utilizaran algunos elementos. No siempre es viable saber con exactitud cuál es el número de elementos a tratar; por tanto, siempre existe la posibilidad de cometer un error de desbordamiento —si se reserva menos espacio del que efectivamente se usara— o bien de hacer uso ineficiente de la memoria —si se reserva más espacio del que realmente se necesita—.

Existe otra alternativa de solución a este problema. Consiste en usar espacios compartidos de memoria para la implementación de pilas. Supongamos que se necesitan dos pilas, cada una de ellas con un tamaño máximo de N elementos. Se definirá entonces un solo arreglo unidimensional de2* N elementos, en lugar de dos arreglos de N elementos cada uno.

Otro error que se puede presentar al trabajar con pilas es tratar de eliminar un elemento de una pila vacía. Este tipo de error se conoce como subdesbordamiento -underflow-.

Operaciones con pilas

La definición de una estructura de datos queda completa al incluir las operaciones que se pueden realizar en ella. Para el caso de las pilas, las operaciones básicas que se pueden. Llevar a cabo son:

Insertar un elemento —Push— en la pila

Eliminar un elemento —Pop— de la pila

Y las operaciones auxiliares:

Pila_vacía

Pila_llena

 

Considerando que se Viene una pila con capacidad para almacenar un número máximo de elementos —MAX—, y que el último de ellos se indica con TOPE, a continuación se presentan los algoritmos correspondientes a las operaciones mencionadas. Si la pila esta vacía, entonces TOPE es igual a 0.

Pila_vacia (PILA,TOPE,BAND)

{Este algoritmo verifica si una estructura tipo pila —PILA— esta vacía, asignando a BAND el valor de verdad correspondiente. La pila se implementa en un arreglo unidimensional. TOPE es un parámetro de tipo entero. BAND es un parámetro de tipo booleano}

1. Si (TOPE = 0) {Verifica si no hay elementos almacenados en la pila}        entonces                  Hacer  BAND <- VERDADERO  {La pila está vacía}          si no                  Hacer BAND <- FALSO  { La pila no está vacía}

Page 13: 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

2. {Fin del condicional del paso 1}

Pila_llena (PILA, TOPE, MAX, BAND)

{Este algoritmo verifica si una estructura tipo pila —PILA— está llena, asignando a BAND el valor de verdad correspondiente. La pila se implementa en un arreglo unidimensional de MAX elementos. TOPE es un parámetro de tipo entero. BAND es un parámetro de tipo booleano}

1. Si (TOPE = MAX)       entonces               Hacer BAND  <- VERDADERO {La pila está llena}         si no               Hacer BAND  <- FALSO {La pila no está llena2. {Fin del condicional del paso 1}

Ahora como ya sabemos cómo evaluar el estado de la pila, podremos entonces insertar o quitar elementos en la lista.

Push(PILA,TOPE,MAX,DATO)

{Este algoritmo agrega el elemento DATO en una estructura tipo – Pila –, y si la misma no está llena. Actualiza el valor TOPE. MAX representa el número máximo de elementos que puede alcanzar PILA. TOPE es un parámetro de tipo entero}

1.  Llamar a Pila_Llena con PILA, TOPE, MAX y BAND2.  Si (BAND = VERDADERO)       entonces               Escribir “Desbordamiento – Pila Llena”       si no               Hacer TOPE <- TOPE + 1 y PILA[TOPE] <- DATO                {Actualiza TOPE e inserta el nuevo elemento en el TOPE de PILA}3. {Fin del condicional del paso 2}

Algoritmo en C, con una estructura dinamica

void push(STACKNODEPTR *topPtr, int info) {       STACKNODEPTR newPtr;       newPtr = malloc(sizeof(STACKNODE));        if (newPtr != NULL) {              newPtr->data = info;              newPtr->nextPtr = *topPtr;              *topPtr = newPtr;       }       else              printf("%d not inserted. No memory available.\n", info);}

Algoritmo en C#, con una estructura estatica

public void Push(Pila P, int x){     if (P.SP < Max)     {

Page 14: 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

          P.SP++;          P.Elemn[P.SP] = x;     }     else     {          MessageBox.Show("La Pila, Esta Llena.","Error en Pila.",MessageBoxButtons.OK, MessageBoxIcon.Error);     }}

Pop(PILA, TOPE, DATO)

{Este algoritmo saca un elemento – Dato – de una estructura tipo pila – PILA –, si ésta no se encuentra vacía. El elemento que se elimina es que se encuentra en la posición indicada por TOPE}

1. Llamar a Pila_Vacia con PILA, TOPE y BAND2. si (BAND = VERDADERO)     entonces               Escribir “Subdesbordamiento – Pila vacía”     si no                 Hacer DATO <- PILA[TOPE] y TOPE <- TOPE -1 {Actualización de TOPE}3. {Fin del condicional del paso 2}

Algoritmo en C, con una estructrura dinamica

int pop(STACKNODEPTR *topPtr){     STACKNODEPTR tempPtr;     int popValue;

     tempPtr = *topPtr;      popValue = (*topPtr)->data;      *topPtr = (*topPtr)->nextPtr;      free(tempPtr);      return popValue;}

 

Algoritmo en C#, con una estructura estatica

public int Pop (Pila J){     int x = 0;     if (J.SP > -1)     {          x = J.Elemn[J.SP];          J.SP--;      }     else     {          MessageBox.Show("La Pila, Esta Vacia.");

Page 15: 6.5 DEFINICIÓN Y USO DE LA ESTRUCTURA TIPO PILA

     }      return (x); }