Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Teoria - Algoritmos I
Teoria - Algoritmos I
30 minutos
Teora:
Preguntas:
30 minutos
Teora:
15 minutos
Ejercicio:
15 minutos
Ejercicio:
Ejercicio para repaso de arrays. Por si hubiera algn problema con este concepto.
Dibujo de un tablero de ajedrez en modo consola.
15 minutos
Ejercicio:
15 minutos
Ejercicio:
Trabajo en Casa
Ejercicios:
Conexin a Prcticas
Ejercicios: Estos conceptos se utilizarn en la sesin I de prcticas sobre algoritmos y estructuras
de datos.
1 Qu es una Pila
Una Pila (stack) es una estructura de datos en la que se permite almacenar informacin apilando los
elementos, es decir, uno sobre otro. Un ejemplo tpico es un tubo de pastillas. Las pastillas en el tubo
estn una encima de la otra.
La estructura de datos Pila tiene unas caractersticas y un comportamiento que va a hacer
que sea sencillo implementar la pila como una clase bajo programacin orientada a objetos.
El comportamiento de una estructura de datos pila se caracteriza por seguir una poltica de
insercin/obtencin de elementos LIFO (Last In First Out), es decir, el ltimo elemento en entrar en la
pila es el primer elemento en salir1.
Como caracterstica propia de una pila podemos decir que al extremo desde el cual se sacan
e insertan elementos se le denomina cima.
Para completar el comportamiento la estructura de datos Pila diremos que dispone de las
siguientes operaciones importantes:
1. Apilar (push): Inserta un elemento en la cima.
2. Desapilar (pop): Obtiene el elemento de la cima.
Siguiendo con el ejemplo del tubo de pastillas, la operacin apilar insertara una pastilla y la
operacin desapilar obtendra la pastilla de la cima del tubo.
Algunos ejemplos de utilizacin de estructuras de datos pilas los podemos encontrar en los
siguientes contextos:
1. Evaluacin de expresiones en notacin postfija (notacin polaca inversa2).
2. Reconocedores sintcticos de lenguajes independientes de contexto.
3. Implementacin de recursividad. Aspecto que veremos la tercera sesin de
algoritmos.
4. Sistemas operativos.
1
2
Toda variacin de este comportamiento har que nos encontremos ante una estructura de datos diferente a una pila.
Haremos un ejercicio de este caso.
2 Pila de Enteros
A continuacin se muestra un ejemplo de implementacin de una pila de enteros que cumple con las
caractersticas y comportamiento mencionados anteriormente. A esta pila de enteros se le ha aadido
funcionalidad mediante los siguientes mtodos:
1. public boolean vacia(): Este mtodo es utilizado para saber si la pila est vaca de
elementos.
2. public boolean llena(): Este mtodo comprueba si la pila est llena.
3. public int numElementos(): Comprobacin del nmero de elementos de la pila.
4. public void imprimir(): Mtodo utilizado simplemente como comprobacin para determinar si
la pila est bien implementada. No es un mtodo propio del comportamiento de una pila.
La clase es la siguiente:
/**
* Universidad Carlos III de Madrid
* Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido.
* Organizacin de Contenidos Audiovisuales.
*
* Pila de Enteros.
*/
/**
* Pila de enteros.
*/
class Pila
{
/** Mximo nmero de elementos a insertar en la pila*/
private int numElementos;
/** Almacn de datos en el que se insertan los elementos **/
private int elementos[];
/** Referencia al ltimo elemento insertado. */
private int indice;
/** Inicalizacin del estado del objeto */
Pila(int numElementos)
{
this.numElementos = numElementos;
// En java el primer ndice de un array es 0.
indice = -1;
// Creamos el array
elementos = new int [numElementos];
}
/** Indica si la pila est vacia */
public boolean vacia()
{
return (indice == -1);
}
/** Indica si la pila est llena */
public boolean llena()
{
return (indice == numElementos-1);
}
/** Inserta un elemento en la pila. No hay control de errores. */
public void apilar(int elemento)
{
indice ++;
A continuacin veremos una clase que implementa una serie de mtodos para probar la clase
pila de enteros.
Ejercicio: Analiza esta clase e indique qu es lo que hace cada mtodo.
/**
* Universidad Carlos III de Madrid
* Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido.
* Organizacin de Contenidos Audiovisuales.
*
* Diferentes ejercicios utilizando la clase pila de enteros.
*/
/*
* Ejercicios varios.
*/
class EjerciciosPilas
{
/** Prueba de pila */
public void ejercicio1(int numElementos)
{
Pila miPila = new Pila(numElementos);
System.out.println("Vacia pila: " + miPila.vacia());
miPila.apilar(5);
miPila.apilar(4);
miPila.apilar(3);
miPila.apilar(2);
miPila.apilar(1);
System.out.println("Llena pila: " + miPila.llena());
System.out.println("Numero de elementos: " + miPila.numElementos());
miPila.imprimir();
}
/** Llenamos de elementos la pila */
public void ejercicio2(int elementos [])
Ejercicio: Si ahora tuviera que implementar una pila de reales, qu cdigo tendras que cambiar? y
si la pila fuera de objetos clientes?
Solucin: No hay que cambiar prcticamente nada, nicamente el tipo de datos manejado por la pila.
Ejercicio: Se te ocurre alguna manera de implementar una pila de cualquier tipo de objetos?
Solucin: S, una pila cuyos elementos son objetos de la clase object, de la que heredan todos los
objetos en java.
Ejercicio: Buscar en la documentacin del API de Java la clase stack e implementar una pila de
objetos Integer.
3 Cola de Enteros
La estructura de datos Cola (queue) es otra estructura de datos bsica que permite almacenar
elementos, estableciendo un orden de llegada y por lo tanto de salida para estos elementos. En la
vida real estamos habituados a observar el comportamiento de una cola, por ejemplo, cuando
esperamos a pagar en la caja de un supermercado.
El mismo comportamiento que seguimos al pagar en la cola del supermercado es el que
ofreceremos para nuestra estructura de datos, que implementaremos como una clase.
El comportamiento de una estructura de datos cola se caracteriza por seguir una poltica de
insercin/obtencin de elementos FIFO (First In First Out), es decir, el primero en entrar es el primero
en salir.
Las operaciones bsicas que se pueden realizar con esta estructura de datos son:
1. Encolar (enqueue): Inserta un elemento en la cola.
2. Desencolar (dequeue): Elimina el elemento en la cola.
Por supuesto, se pueden ofrecer ms mtodos que completen la funcionalidad de esta
estructura de datos como por ejemplo:
1.
2.
3.
4.
Algunos ejemplos de utilizacin de estructuras de datos colas los podemos encontrar en los
siguientes contextos:
1. Sistemas operativos.
2. Videojuegos.
3. Programas de comunicacin por red.
Ejercicio: Partiendo de la estructura de datos Pila explicada anteriormente y visto el comportamiento
de una estructura de datos cola, implementa una clase que modele el comportamiento de una cola.
/**
* Universidad Carlos III de Madrid
* Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido.
* Organizacin de Contenidos Audiovisuales.
*
* Cola de Enteros.
*/
/**
* Cola de enteros.
*/
class Cola
"
"
"
"
"
+
+
+
+
+
cola.desencolar());
cola.desencolar());
cola.desencolar());
cola.desencolar());
cola.desencolar());
} // EjercicioColas
Al igual que en la clase Cola, el mtodo imprimir no es propio de la clase y slo es utilizado
para realizar comprobaciones.
La implementacin que se muestra es un ejemplo partiendo de la clase pila. Se nota que
partimos de la clase pila porque prcticamente todos los mtodos son iguales salvo el que saca los
elementos, que lo cambiamos para posicionar el resto de informacin en el lugar conveniente.
Hay muchas variantes de implementacin de una estructura de datos cola. Si el alumno est
interesado podemos discutir muchas de ellas. Aun as se propone el siguiente ejercicio.
Ejercicio: En la implementacin anterior dejamos fijo el elemento de la cabeza de la cola y cada vez
que sacamos un elemento tenemos que mover el resto. Hay una implementacin que permite no fijar
el elemento de la cola a la posicin cero del array. Son las colas circulares. Imple menta una cola
circular. Se te ofrece de ayuda un algoritmo que recorre un array de forma circular.
10
/**
* Universidad Carlos III de Madrid
* Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido.
* Organizacin de Contenidos Audiovisuales.
*
* Ejemplo de recorrido circular por un array.
*/
/**
* Ejemplo de recorrido circular por un array.
*/
class RecorridoCircularArray
{
// Recorrido circular.
public static void main(String args[])
{
int elementos [] = new int[10];
int i = 0;
// Cargamos el array
for (i=0;i<10;i++)
elementos[i] = i+1;
Ejercicio: existe alguna clase en java que implemente el comportamiento de una cola?
11
4 Ejercicio 1. Palndroma
Ejercicio: Utilizando las estructuras de datos anteriores determinar si una palabra o frase es
palndroma. Una palabra o frase es palndroma si se lee igual de izquierda a derecha que de derecha
a izquierda.
Solucin:
Los pasos a seguir para resolver este problema son los siguientes:
1) Se implementa una pila de caracteres.
2) Se implementa una cola de caracteres.
3) Se le pide al usuario por teclado la frase o palabra.
4) Cada uno de los caracteres de esa frase o palabra (sin tener en cuenta los espacios en blanco) se
insertan en la pila y en la cola, transformndolos previamente a maysculas.
5) Para comprobar si la palabra o frase es palndroma se saca un elemento de la pila y un elemento
de la cola, si los dos coinciden continuamos hasta terminar con todos los elementos. Si no coincide la
palabra o frase no es palndroma y si hemos dejado la cola y pila vacas la frase o palabra es
palndroma.
La mejor solucin de las implementadas por los alumnos ser publicada en la web de la
asignatura para que est disponible para el resto de alumnos.
Enviad las soluciones a jruiz@solusoft.es
12
Ejercicio: Se te ocurre otra forma de determinar si una palabra o frase es palndroma sin utilizar
estas estructuras de datos?
/**
* Universidad Carlos III de Madrid
* Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido.
* Organizacin de Contenidos Audiovisuales.
*
* Ejemplo de programa que detecta si una palabra o frase es palndroma.
*/
/**
*
* Programa palabra o frase palndroma.
*/
public class Palindroma
{
/**
* Detecta si una palabra es palndroma
* @param cadena String
* @return boolean
*/
public boolean esPalindroma(String cadena)
{
// Al incio suponemos que es palndroma
boolean esPalin = true;
// Variable para detectar el fin del bucle (llegamos al extremo)
boolean fin = false;
// Cadena a minsculas y sin blancos para evitar problemas
String cad = cadena.replaceAll(" ","");
cad = cad.toLowerCase();
// Inicializamos en extremo izquierdo y extremo derecho
int izq_a_der = 0;
int der_a_izq = cad.length() - 1;
// Recorremos
while ((esPalin) && (!fin))
{
// Comparamos el caracter
esPalin = (cad.charAt(izq_a_der) == cad.charAt(der_a_izq));
// antes de comparar comprobamos que no es blanco el
izq_a_der++;
der_a_izq--;
// Comprobamos si hemos terminado.
fin = ((der_a_izq == -1) || (izq_a_der ==cad.length()));
}
return esPalin;
}
public static void main(String [] args)
{
boolean palindroma = false;
Palindroma p = new Palindroma();
System.out.println("==========");
System.out.println("PALINDROMA");
System.out.println("==========");
palindroma = p.esPalindroma("Ana");
System.out.println("Ana: " + palindroma);
13
14
15
// Sumatorio
public void ejercicio4()
{
long elementos [] = new long[200];
// Cargamos el array
for (int i=0;i<200;i++)
{
elementos[i] = i+1;
}
// Sumnatorio
long sumatorio = 0;
for (int i=0;i<200;i++)
{
sumatorio = sumatorio + elementos[i];
}
System.out.println("El sumatorio es: " + sumatorio);
} // Ejercicio4
// Ejecucin
public static void main(String args[])
{
RepasoArrays r = new RepasoArrays();
r.ejercicio1();
r.ejercicio2();
r.ejercicio3();
r.ejercicio4();
} // main
} // RepasoArrays
16
Ejercicio: Cmo deberamos ampliar el ejercicio para poder tratar el conjunto de piezas y situarlas
sobre el tablero de ajedrez?
Solucin: Crearamos objetos de la clase Pieza y los situaramos en su posicin. Se implementar en
la clase prctica correspondiente.
17
18
El RPN (por sus siglas en ingls) se basa en el concepto de pila de datos. Primero se introducen los
datos en la pila y luego se indica la orden a realizar.
(fuente original: es.wikipedia.org)
19
20
21