Clases de Pilas

Anuncio
PILAS
ESTRUCTURAS DE DATOS
2006
Prof. Ing. M.Sc. Fulbia Torres
UNIDAD II
ESTRUCTURAS DE DATOS
PILAS
Definición.
Operaciones.
Implementación secuencial.
Aplicaciones.
Ejemplos. Ejercicios.
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
DEFINICIÓN
Una PILA (o stack) es una estructura ordenada y homogénea, en la
que podemos añadir o quitar elementos solamente en un extremo de
la estructura. El extremo donde se realizan estas operaciones se
denomina habitualmente TOPE.
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
DEFINICIÓN
Se dice que es una estructura ordenada, porque sus elementos se
sitúan siguiendo un cierto orden, no que estén ordenados en función
de su valor.
Se dice que se trata de una estructura homogénea, porque todos sus
elementos son del mismo tipo, pueden ser tanto simples (enteros,
reales,…) como compuestos (registros, vectores, ...)
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
DEFINICIÓN
Dada una pila P, formada por los elementos a, b, c, ..., k
(P=(a,b,c,...,k)), se dice que a, que es el elemento más inaccesible de
la pila, está en el fondo de la pila (bottom) y que k, por el contrario, el
más accesible, está en el tope.
Las restricciones definidas para la pila implican que si una serie de
elementos A, B, C, D, E, F se añaden, en este orden, a una pila
entonces el primer elemento que se elimine (borre) de la estructura
deberá ser F. Por tanto, resulta que el último elemento que se inserta
en una pila es el primero que se borra. Por esa razón, se dice que la
pila sigue una politica de tipo LIFO (Last In First Out, el último que
entra es el primero que sale).
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
DEFINICIÓN
Un ejemplo típico de pila lo constituye un montón de platos: Cuando
se quiere introducir un nuevo plato, éste se coloca en la posición más
accesible, encima del último plato. Cuando se agarra un plato, éste
se extrae, igualmente, del punto más accesible, el último que se ha
introducido.
Otro ejemplo sería una caja llena de libros. Sólo podemos ver cuál es
el libro que está más arriba en la caja, y si ponemos o agarramos un
libro, sólo podremos actuar sobre este primer libro. No podemos
siquiera saber el número total de libros guardados en la pila. Sólo
sabremos el número de elementos de la pila de libros si previamente
los sacamos hasta vaciar la caja.
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
CARACTERÍSTICAS
Una PILA es un objeto dinámico que cambia constantemente.
Son muy utilizadas en programación para evaluar expresiones,
reconocer lenguajes, recorrer árboles y simular procesos recursivos.
Sobre una pila se pueden realizar operaciones que permiten
acceder y manipular los elementos almacenados en la misma.
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
OPERACIONES
Veamos cual es la especificación formal del tipo de datos
abstracto pila:
TAD: pila
Operaciones:
CONSTRUCTORA
Crea una pila vacía.
CrearPila:
Pila
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
OPERACIONES
MODIFICADORAS
Dada una pila p y un valor e, del tipo base, devuelve una nueva pila
formada al apilar en p el nuevo elemento sobre la posición indicada por
el valor del tope.
AdicPila: Pila x tipo_base
Pila
Dada una pila, elimina el elemento indicado por el valor del tope y
devuelve la nueva pila.
ElimPila:
Pila
Pila
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
OPERACIONES
ANALIZADORAS
Devuelve el valor del elemento que está apuntado por el tope.
InfoPila: Pila
tipo_base
Devuelve el valor verdadero si la pila está vacía y falso en caso
contrario.
PilaVacia: Pila
lógico
Devuelve el valor verdadero si la pila está llena y falso en caso
contrario.
PilaLlena: Pila
lógico
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
OPERACIONES
DESTRUCTORA
Destruye la pila retornando toda la memoria ocupada.
DestruirPila:
Pila
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
OPERACIONES
Eliminar
Adicionar
Tope
PILA
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos)
DEFINICIÓN
# define MAXELEM número máximo de elementos
struct tipopila {
int tope;
tipo_base elementos [MAXELEM];
}
struct tipopila p;
Ing. M.Sc. Fulbia Torres
ING. MSc.Estructuras
FULBIA TORRES
Asignatura:
de Datos
ASIGNATURA:
ESTRUCTURAS
DE DATOS
Barquisimeto 2006
BARQUISIMETO 2005
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos)
Con esta definición de Pila las operaciones asociadas especificadas
en el TAD quedarían del siguiente modo:
Crea una pila vacía.
int CrearPila (struct tipopila *p)
{
return (*p).tope = -1;
}
Ing. M.Sc. Fulbia Torres
ING. MSc.Estructuras
FULBIA TORRES
Asignatura:
de Datos
ASIGNATURA:
ESTRUCTURAS
DE DATOS
Barquisimeto 2006
BARQUISIMETO 2005
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos)
Dada una pila p y un valor e, del tipo base, devuelve una nueva pila
formada al apilar en p el nuevo elemento sobre la posición indicada
por el valor del tope.
void AdicPila (struct tipopila *p, tipo_base valor)
{
if PilaLlena (p) { cout << "Pila Overflow \n";
exit (1);
}
else (*p).elementos[++ ((*p).tope) ] = valor;
}
Ing. M.Sc. Fulbia Torres
ING. MSc.Estructuras
FULBIA TORRES
Asignatura:
de Datos
ASIGNATURA:
ESTRUCTURAS
DE DATOS
Barquisimeto 2006
BARQUISIMETO 2005
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos)
Dada una pila, elimina el elemento indicado por el valor del tope y
devuelve la nueva pila.
tipo_base ElimPila (struct tipopila *p)
{
if PilaVacia (p) { cout << "Pila Underflow \n";
exit (1);
}
return ((*p).elementos[((*p).tope)--]);
}
Ing. M.Sc. Fulbia Torres
ING. MSc.Estructuras
FULBIA TORRES
Asignatura:
de Datos
ASIGNATURA:
ESTRUCTURAS
DE DATOS
Barquisimeto 2006
BARQUISIMETO 2005
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos)
Devuelve el valor del elemento que está apuntado por el tope.
tipo_base InfoPila (struct tipopila *p)
{
if PilaVacia (p) { cout << "Pila Underflow \n";
exit (1);
}
else return ((*p).elementos[(*p).tope]);
}
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos)
Devuelve el valor verdadero si la pila está vacía y falso en caso
contrario.
int PilaVacia (struct tipopila *p)
{
if ( (*p).tope == -1)
return 1;
else return 0;
}
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos)
Devuelve el valor verdadero si la pila está llena y falso en caso
contrario.
int PilaLlena (struct tipopila *p)
{
if ( (*p).tope == MAXELEM)
return 1;
else return 0;
}
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos)
Destruye la pila retornando toda la memoria ocupada.
void DestruirPila (struct tipopila *p)
{
delete (p);
}
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
Implementar una función que cuente y elimine de la pila todas las
ocurrencias del elemento entero val.
void EliminaOcurren(struct tipopila *p, int elem)
{
int val=0, cuenta=0;
//declaración variables
struct tipopila paux;
//pila auxiliar
CrearPila(&paux);
while (!PilaVacia(p))
{
val=ElimPila(p);
//crea una pila auxiliar vacía
//saca el elemento que está en el tope de la pila
//y lo almacena en val
if (elem==val) {cuenta++;
//cuenta la ocurrencia y queda eliminado
cout<< "Eliminando";}
else AdicPila(&paux,val);
//si no es igual lo agrega a la pila auxiliar
}
while(!PilaVacia(&paux))
//devuelve a la pila original los elementos de la pila auxiliar
{
val=ElimPila(&paux);
AdicPila(p,val);
}
cout<< " PILA "; cout << endl; MosElem(p); cout << "\n";
}
//muestra los elementos
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES
DEFINICIÓN
# define MAXELEM número máximo de elementos
typedef tipo tipo_base;
class Pila
{
private:
int tope;
tipo_base elementos[MAXELEM];
public:
Pila( )
{
tope = -1;
// condición de pila vacía
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
}
Barquisimeto 2006
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES
CONTINUACIÓN DEFINICIÓN
void Pila :: AdicPila (tipo_base valor);
tipo_base Pila :: ElimPila();
tipo_base Pila :: LimpiarPila();
tipo_base Pila :: InfoPila();
bool Pila :: PilaVacia();
bool Pila :: PilaLlena();
//operación Modificadora
//operación Modificadora
//operación Modificadora
//operación Analizadora
//operación Analizadora
//operación Analizadora
}
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES
Agrega un elemento a la Pila.
void Pila :: AdicPila( tipo_base valor)
{
if PilaLlena () cout << "Pila Overflow \n”;
else elementos[++ tope ] = valor;
}
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES
Elimina el elemento indicado por el valor del tope.
tipo_base Pila :: ElimPila()
{
if (PilaVacia()) { cout<<"Error: Pila underflow\n"; exit(1); }
else return elementos[tope--];
}
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES
Pone el tope de la pila a su valor inicial.
void Pila :: LimpiarPila()
{
tope = -1;
}
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES
Devuelve el valor del elemento que está apuntado por el tope.
tipo_base Pila :: InfoPila ()
{
if (PilaVacia()) { cout<<"Error: Pila underflow\n"; exit(1); }
else return elementos[tope];
}
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES
Devuelve el valor verdadero si la pila está vacía.
bool Pila :: PilaVacia ()
{
return tope == -1;
}
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES
Devuelve el valor verdadero si la pila está vacía.
bool Pila :: PilaLlena ()
{
return tope == MAXELEM -1;
}
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
#include <iostream.h>
#include <string.h>
#include "pilalineal.h"
typedef char tipo_base;
//Verifica si una palabra es palindromo
int main()
{
pilalineal p;
bool espal;
char pal[81];
cout << "Teclea la palabra verificar si es palindromo: " << endl;
cin.getline(pal,sizeof(pal));
for(int i=0; i<strlen(pal); )
{
char c;
c = pal[i++];
p.AdicPila(c);
}
espal = true;
for(int j=0; espal && !p.PilaVacia(); )
{
char c;
c = p.ElimPila();
espal = pal[j++] == c;
}
p.LimpiarPila();
if (espal) cout << "La palabra " << pal << " es un palindromo" << " \n";
else cout << "La palabra " << pal << " no es un palindromo" << " \n";
return 0;
}
PILA
APLICACIONES
Llamadas a subprogramas.
Correspondencia de paréntesis.
Tratamiento de expresiones aritméticas.
Recursividad.
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
APLICACIONES
CORRESPONDENCIA DE PARÉNTESIS
Pasos:
Se rastrea la cadena de elementos de izquierda a derecha.
Cada vez que se encuentre un paréntesis izquierdo se mete en
la pila.
Cada vez que se encuentre un paréntesis derecho se revisa el
contenido de la pila. Si está vacía entonces habremos
encontrado un paréntesis derecho que no cierra un paréntesis
izquierdo, y hay un error.
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
APLICACIONES
CORRESPONDENCIA DE PARÉNTESIS
Si la pila no está vacía se ha encontrado el par y solo se saca
de la pila.
Si la pila no está vacía al terminar la cadena, entonces hay un
paréntesis izquierdo sin cerrar. Hacer Ejercicio
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
APLICACIONES
TRATAMIENTO DE EXPRESIONES ARITMÉTICAS
Revisamos algunos conceptos:
Dada la expresión A + B se dice que está en notación infija y su
nombre se debe a que el operador (+) está entre los operandos
(A y B).
Dada la expresión AB+ se dice que está en notación postfija y
su nombre se debe a que el operador (+) está después de los
operandos (A y B).
Dada la expresión + AB se dice que está en notación prefija y y
su nombre se debe a que el operador (+) está antes de los
operandos (A y B).
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
APLICACIONES
TRATAMIENTO DE EXPRESIONES ARITMÉTICAS
Para convertir una expresión en notación polaca (post) o (pre),
deberán establecerse previamente ciertas condiciones:
Solamente se manejaran los siguientes operadores ordenados de
mayor a menor según su prioridad de ejecución:
$ potencia
* / (multiplicación y división)
+ - (suma, resta)
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
APLICACIONES
TRATAMIENTO DE EXPRESIONES ARITMÉTICAS
Continuación:
Los operadores de más alta prioridad se ejecutan primero.
Si hubiera en una expresión dos o más operadores de igual prioridad,
entonces se procesarán de izquierda a derecha, excepto en el caso de
la exponenciación, en donde se supone que el orden es de derecha a
izquierda.
Las subexpresiones parentizadas tedrán más prioridad que cualquier
otro operador.
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
APLICACIONES
TRATAMIENTO DE EXPRESIONES ARITMÉTICAS
Ejemplo:
Convertir de infija a postfija:
A+B*C
A + BC*
ABC*+
(A + B) * C
(A + b) * (C - D)
A $ B * C - D + E / F / (G + H)
(A + B) * (C $ (D - E) + F) - G
((A + B) * C - (D - E)) $ (F + G)
infija
operando único
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
APLICACIONES
TRATAMIENTO DE EXPRESIONES ARITMÉTICAS
Ejemplo:
Convertir de infija a prefija:
A+B*C
A + *BC
+A*BC
(A + B) * C
(A + B) * (C - D)
A $ B * C - D + E / F / (G + H)
(A + B) * (C $ (D - E) + F) - G
((A + B) * C - (D - E)) $ (F + G)
infija
operando único
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
APLICACIONES
TRATAMIENTO DE EXPRESIONES ARITMÉTICAS
Reglas utilizando pilas (notación infija a postfija):
Si el símbolo es un paréntesis que abre “(“ éste se mete en la
pila de operadores.
Si el símbolo es un paréntesis que cierra “)” se saca de la pila
todo lo que exista hasta llegar al primer paréntesis que abra “(“.
Los operadores van a la salida, a medida que salen de la pila.
El paréntesis que abre “(“ se saca pero no va a la salida.
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
APLICACIONES
TRATAMIENTO DE EXPRESIONES ARITMÉTICAS
Continuación:
Si el símbolo es un operador, entonces, si el operador en el tope de
la pila es de la misma o de mayor precedencia, dicho operador se
saca y va a la salida, continuando de esta manera hasta que el
primer paréntesis izquierdo o un operador de menor precedencia
se encuentre en la pila, Cuando esto ocurre, el operador en turno
se mete a la pila.
Si el símbolo es un operando, éste se envía directamente a la
salida.
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
APLICACIONES
TRATAMIENTO DE EXPRESIONES ARITMÉTICAS
Ejemplo: Infijo a postfijo.
((A + B) * C / D + E $ F) / G
(
(
(
(
(
+
(
(
(
* /
( (
/
(
+ $
( +
(
/
Salida: A B + C * D / E F $ + G /
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
APLICACIONES
EVALUACIÓN DE UNA EXPRESIÓN POSTFIJA
Cada operador en una cadena postfija hace referencia a los dos
operandos anteriores de la cadena (por supuesto, uno de estos dos
operandos puede ser el resultado de aplicar un operador anterior).
Cada vez que se lee un operando se agrega a la pila.
Cuando se encuentra un operador, sus operandos son los dos
elementos superiores en la pila, después se pueden remover estos dos
elementos, ejecutar la operación indicada sobre ellos y agregar el
resultado a la pila para que esté disponible como operando del
operador siguiente.
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
APLICACIONES
EVALUACIÓN DE UNA EXPRESIÓN POSTFIJA
Ejemplo:
ABC *+
oper1
oper2
B
A
C
B*C
pila
A
A,B
A,B,C
A,B*C
A + (B * C)
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
PILA
APLICACIONES
EVALUACIÓN DE UNA EXPRESIÓN POSTFIJA
Ejemplo: A=6, B=3, C=1
631*+
símbolo
oper1
6
3
1
*
3
+
6
oper2
valor
1
3*1
3
9
pila
6
6,3
6,3,1
6,3*1
6, 3
9
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
EVALUACIÓN DE UNA EXPRESIÓN PREFIJA
Ejemplo:
símbolo
*
+
a
b
* + ab – cd
oper1
oper2
a
b
d
a+b
c
c
d
c-d
pila
*
*,+
*, +, a
*, +, a, b
*, a + b
*, a + b, *, a + b, -, c
*, a + b, -, c, d
*, a + b, -, c - d
(a + b) * (c - d)
PILA
EJERCICIOS PROPUESTOS
Capitulo de pilas
Ejercicios pag. 85 : 2.1.1 todos, 2.1.3
Ejercicios: pag. 95: 2.2.4, 2.2.8
De infijo a postfijo pag. 115: 2.3.1 todas, 2.3.2 todas, 2.3.3
todas, 2.3.4
Ejercicio 2.3.7, hacerlo también para postfija.
Guia de ejercicios
Ing. M.Sc. Fulbia Torres
ING. MSc.Estructuras
FULBIA TORRES
Asignatura:
de Datos
ASIGNATURA:
ESTRUCTURAS
DE DATOS
Barquisimeto 2006
BARQUISIMETO 2005
GRACIAS POR SU
ATENCIÓN
HASTA LA PRÓXIMA
CLASE
Ing. M.Sc. Fulbia Torres
Asignatura: Estructuras de Datos
Barquisimeto 2006
Descargar