Está en la página 1de 21

Universidad Carlos III de Madrid

Departamento de Ingeniera Telemtica


Organizacin de Contenidos Audiovisuales

Algoritmos y Estructuras de Datos I


Objetivo:

Conocimientos mnimos sobre estructuras de datos: Pilas y Colas.


Ejercitarse en el uso de estructuras de datos sobre pilas y colas.

30 minutos

Teora:

Explicacin terica breve de lo que es una estructura de datos Pila.


Implementacin con la colaboracin de los alumnos de una Pila de enteros.

Preguntas:

Diferencias de implementacin entre una pila de enteros, reales, objetos, etc?


Como soluciona esto Java: Stack, genricos.
Cmo se utiliza la clase Stack? Mirar (se resuelve en la siguiente clase).

30 minutos

Teora:

Explicacin terica breve de lo que es una estructura de datos Cola.


Implementacin con la colaboracin de los alumnos de una Cola de enteros.
Es aplicable a una cola el concepto de genricos visto anteriormente?
Existe alguna clase en java que implemente una cola? Se resolver en la
prxima clase.

15 minutos
Ejercicio:

Utilizando las estructuras de datos anteriores determinar si una palabra o frase es


palndroma.
Se le ocurre otra forma de determinar si una palabra o frase es palndroma sin utilizar
estas estructuras de datos?

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:

Implementacin de los combos de movimiento en un videojuego. Utilizacin de Cola.

15 minutos
Ejercicio:

Clculo de expresiones matemticas con parntesis. Utilizacin de una Pila.

Jorge Ruiz Magaa

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales

Trabajo en Casa
Ejercicios:

Cmo se utiliza la clase Stack? Que se lo miren y se resuelve en la siguiente


clase.
Existe alguna clase en java que implemente una cola? Se deja a los alumnos
que lo hagan para resolverlo en la prxima clase.
Resolucin de los ejercicios que no de tiempo a terminar en clase.
Escribir el contenido de una pila utilizando slo los mtodos pblicos de la
clase Pila.
Escribir el contenido de una Pila, empezando por la base, utilizando la clase
Pila y dejndola como estaba originalmente.
Pilas y Colas como ejemplo de planificador de tareas es un sistema operativo.

Conexin a Prcticas
Ejercicios: Estos conceptos se utilizarn en la sesin I de prcticas sobre algoritmos y estructuras
de datos.

Jorge Ruiz Magaa

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales

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.

Jorge Ruiz Magaa

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales

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 ++;

Jorge Ruiz Magaa

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales
elementos[indice] = elemento;
}
/** Saca un elemento de la pila. No hay control de errores */
public int desapilar()
{
int elemento = elementos[indice];
indice--;
return elemento;
}
/** Devuelve el nmero de elementos que tiene la pila */
public int numElementos()
{
return indice+1;
}
/** Imprime los elementos de la pila
* Este mtodo es de comprobacin. No es un mtodo propio de la
* clase Pila. */
public void imprimir()
{
for (int i=0; i<=indice; i++)
System.out.print(elementos[i] + "-");
System.out.println();
}
} // Pila

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 [])

Jorge Ruiz Magaa

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales
{
Pila miPila = new Pila(elementos.length);
/** Cargamos con unos valores del array */
for (int i=0;i<elementos.length;i++)
{
miPila.apilar(elementos[i]);
}
miPila.imprimir();
}
/** Los sacamos y los imprimimos */
public void ejercicio3(int elementos [])
{
Pila miPila = new Pila(elementos.length);
int elementosFinal[] = new int[elementos.length];
int i,j;
/** Cargamos con unos valores del array */
for (i=0;i<elementos.length;i++)
{
miPila.apilar(elementos[i]);
}
miPila.imprimir();
// Sacamos a un e imprimimos por pantalla.
j = 0;
for (i=0;i<elementos.length;i++)
{
elementosFinal[j] = miPila.desapilar();
j++;
}
// Imprimir . podra haber aprovechado el bucle anterior?
for (i=0;i<elementosFinal.length;i++)
{
System.out.println("Elemento " + i + ": " + elementosFinal[i]);
}
} // Ejercicio 3
/** Los sacamos y los imprimimos y los volvemos a insertar*/
public void ejercicio4(int elementos [])
{
Pila miPila = new Pila(elementos.length);
int elementosFinal[] = new int[elementos.length];
int i,j;
/** Cargamos con unos valores del array */
for (i=0;i<elementos.length;i++)
{
miPila.apilar(elementos[i]);
}
miPila.imprimir();
// Sacamos a un e imprimimos por pantalla.
j = 0;
for (i=0;i<elementos.length;i++)
{
elementosFinal[j] = miPila.desapilar();
j++;
}
// Imprimir . podra haber aprovechado el bucle anterior?
for (i=0;i<elementosFinal.length;i++)
{
System.out.println("Elemento " + i + ": " + elementosFinal[i]);
miPila.apilar(elementosFinal[i]);
}
// Imprimir
miPila.imprimir();
// Aparecen en orden inverso por el funcionamiento de la pila.
} // Ejercicio 4
/**
* main para probar los ejercicios.
*/
public static void main(String [] args)
{

Jorge Ruiz Magaa

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales
EjerciciosPilas ejercicios = new EjerciciosPilas();
int numElementos = 5;
ejercicios.ejercicio1(numElementos);
int elementos [] = {1,2,3,4,5};
ejercicios.ejercicio2(elementos);
ejercicios.ejercicio3(elementos);
ejercicios.ejercicio4(elementos);
}
} // EjerciciosPilas

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: Crees que lo que estamos haciendo es reinventar la rueda? Qu herramientas y


mecanismos provee Java para implementar una pila de cualquier tipo de datos?
Solucin: Efectivamente, la implementacin de las estructuras de datos pila est superada hace
mucho tiempo por los entornos de programacin que proporcionan mecanismos para utilizarlas.
Concretamente Java proporciona dos:
1) Clase stack, que ofrece la posibilidad de manejar una pila de cualquier tipo de objetos.
2) Genricos, desde la versin 1.5 de Java podemos utilizar genricos para poder implementar pilas
de cualquier tipo de elementos sin tener la necesidad de utilizar cambios de tipo. Esta caracterstica
no la veremos en este curso.

Ejercicio: Buscar en la documentacin del API de Java la clase stack e implementar una pila de
objetos Integer.

Jorge Ruiz Magaa

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales

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.

Determinar si la cola est vaca.


Determinar si la cola est llena.
Obtener el elemento de la primera posicin de la cola (sin sacarlo de la cola).
Etc.

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

Jorge Ruiz Magaa

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales
{
/** Mximo nmero de elementos a insertar en la cola*/
private int numElementos;
/** Almacn de datos en el que se insertan los elementos **/
private int elementos[];
/** Referencia al ltimo elemento insertado. */
private int ultimo;
/** Inicalizacin del estado del objeto */
Cola(int numElementos)
{
this.numElementos = numElementos;
// En java el primer ndice de un array es 0.
ultimo = -1;
// Creamos el array
elementos = new int [numElementos];
}
/** Indica si la cola est vacia */
public boolean vacia()
{
return (ultimo == -1);
}
/** Indica si la cola est llena */
public boolean llena()
{
return (ultimo == numElementos-1);
}
/** Inserta un elemento en la cola. No hay control de errores. */
public void encolar(int elemento)
{
ultimo ++;
elementos[ultimo] = elemento;
}
/** El elemento de la primera posicin es el que sale.
* No hay control de errores */
public int desencolar()
{
int elemento = elementos[0];
// Hay que mover todos los elementos una posicin hacia
// atrs.
for (int i=0;i<ultimo;i++) elementos[i] = elementos[i+1];
// Decrementamos ltimo porque hemos sacado un elemento.
ultimo--;
return elemento;
}
/** Devuelve el nmero de elementos que tiene la cola */
public int numElementos()
{
return ultimo+1;
}
/** Imprime los elementos de la cola
* Este mtodo es de comprobacin. No es un mtodo propio de la
* clase Cola. */
public void imprimir()
{
for (int i=0; i<=ultimo; i++)
System.out.print(elementos[i] + "-");
System.out.println();
}
} // Cola

Jorge Ruiz Magaa

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales

La clase que permite probar la cola es la siguiente:


/**
* Universidad Carlos III de Madrid
* Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido.
* Organizacin de Contenidos Audiovisuales.
*
* Cola de Enteros.
*/
/**
* Prueba de la cola de enteros.
*/
class EjercicioColas
{
public static void main(String args[])
{
// Cola de cinco elementos.
Cola cola = new Cola(5);
System.out.println("Esta vacia?: " + cola.vacia());
cola.encolar(5);
cola.encolar(4);
cola.encolar(3);
cola.encolar(2);
cola.encolar(1);
System.out.println("Esta llena?: " + cola.llena());
int elemento = 0;
System.out.println("Elemento:
System.out.println("Elemento:
System.out.println("Elemento:
System.out.println("Elemento:
System.out.println("Elemento:

"
"
"
"
"

+
+
+
+
+

cola.desencolar());
cola.desencolar());
cola.desencolar());
cola.desencolar());
cola.desencolar());

System.out.println("Esta vacia?: " + cola.vacia());


} // main

} // 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.

Jorge Ruiz Magaa

10

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales

/**
* 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;

// Lo recorremos 2 veces de forma intuitiva.


/*
int j = 0;
for (i=0;i<20;i++)
{
System.out.println(elementos[j]);
if (j==9)
j=0;
else
j++;
}
*/
// Lo recorremos dos veces mediante operaciones mdulo
for (i=0;i<20;i++)
{
// Observa que 10 es el nmero de elementos.
System.out.println(elementos[i%10]);
}
} // main
} // RecorridoCircularArray

Implementaremos una cola circular en las prcticas de la asignatura.

Ejercicio: Es aplicable el concepto de genricos visto anteriormente?

Ejercicio: existe alguna clase en java que implemente el comportamiento de una cola?

Jorge Ruiz Magaa

11

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales

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

Jorge Ruiz Magaa

12

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales

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);

Jorge Ruiz Magaa

13

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales
palindroma = p.esPalindroma("Si a la ingenieria telematica");
System.out.println("Si a la ingenieria telematica: " + palindroma);
palindroma = p.esPalindroma("Dabale arroz a la zorra el abad");
System.out.println("Dabale arroz a la zorra el abad: " + palindroma);
}
} // Palindroma

Jorge Ruiz Magaa

14

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales

5 Ejercicio 2. Repaso de Arrays


A continuacin se muestran una serie de algoritmos a modo de repaso sobre arrays. Los arrays es un
tema que se ha visto con suficiente profundidad en la asignatura de Representacin de Datos y
Aplicaciones por lo que no se le dedicar ms tiempo.
/**
* Universidad Carlos III de Madrid
* Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido.
* Organizacin de Contenidos Audiovisuales.
*
* Repaso de arrays.
*/
/**
*
* Repaso de arrays.
*/
class RepasoArrays
{
/** Clculo del mayor de los enteros */
public void ejercicio1()
{
int elementos [] = new int[200];
// Cargamos el array
for (int i=0;i<200;i++)
{
elementos[i] = i+1;
}
// Calculamos el mayor
int mayor = Integer.MIN_VALUE;
for (int i=0;i<200;i++)
{
if (elementos[i]>mayor)
{
mayor = elementos[i];
}
}
System.out.println("El mayor es: " + mayor);
} // Ejercicio 1
// Media de los elementos
public void ejercicio2()
{
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];
}
// Importante el cambio de tipo por la precisin.
double media = (double)sumatorio/(double)200;
System.out.println("la media es: " + media);

Jorge Ruiz Magaa

15

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales
} // ejercicio2

// mostramos los pares de un array


public void ejercicio3()
{
int elementos [] = new int[200];
// Cargamos el array
for (int i=0;i<200;i++)
{
elementos[i] = i+1;
}
// Sacamos pares
for (int i=0;i<200;i++)
{
if (elementos[i] % 2 == 0)
System.out.println(elementos[i]);
}
} // ejercicio3

// 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

Ejercicio: Dibujo de un tablero de ajedrez en modo consola.


/**
* Universidad Carlos III de Madrid
* Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido.
* Organizacin de Contenidos Audiovisuales.
*
* Pintar un tablero de ajedrez en modo consola
*/
/**
*

Jorge Ruiz Magaa

16

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales
* Pintamos un tablero de ajedrez en modo consola
*/
class TableroAjedrez
{
// Tablero de ajedrez con array de dos dimensiones.
public void pintar()
{
char tablero[][] = new char[8][8];
char celda = '0';
for (int filas = 0; filas < 8; filas++)
{
for (int columnas = 0; columnas < 8; columnas++)
{
if (columnas == 0)
{
if (filas % 2 == 0)
{
// Negro
celda = 'N';
}
else
{ // Blanco
celda = 'B';
}
}
else
{
if (celda == 'B')
celda = 'N';
else
celda = 'B';
}
tablero[filas][columnas] = celda;
}
}
// Imprimimos en pantalla
for (int filas = 0; filas < 8; filas++)
{
for (int columnas = 0; columnas < 8; columnas++)
{
System.out.print(tablero[filas][columnas]);
}
System.out.println();
}
}
// Probamos
public static void main(String args[])
{
TableroAjedrez t = new TableroAjedrez();
t.pintar();
} //main
} // TableroAjedrez

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.

Jorge Ruiz Magaa

17

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales

6 Ejercicio 3. Combos de movimiento en un videojuego


Imaginemos un juego de lucha, estilo Teken, Virtua Figther, etc. se le ocurre alguna manera de
implementar la gestin de los combos de ataque? Un combo, es la pulsacin consecutiva de varios
botones durante un periodo de tiempo pequeo. Dependiendo de la secuencia de botones pulsada se
ejecutar un ataque u otro.
No es objetivo de este ejercicio implementar la el cdigo fuente necesario pero s hay que
indicar mediante la redaccin de un pequeo prrafo la solucin que implementara usted.

Jorge Ruiz Magaa

18

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales

7 Clculos en notacin polaca inversa


La notacin polaca inversa, tambin llamada notacin postfija, es un mtodo de introduccin de
rdenes alternativo a la notacin algebraica usado en las calculadoras Hewlett-Packard y en algunos
lenguajes como PostScript o Forth.
En 1920 Jan Lukasiewicz ide un mtodo para escribir expresiones matemticas sin utilizar ni
parntesis ni corchetes llamada notacin polaca. En 1972 HP se bas en l e incorporo en su primera
calculadora cientfica de bolsillo, la HP35, la notacin polaca inversa.
Este sistema no es el habitual de las calculadoras pero tiene varias ventajas:

Ahorra pulsaciones de teclas, con lo que se introducen los datos ms rpido.


Permite ver los resultados intermedios, con lo que se perciben ms fcilmente los errores.
Se parece a como se calcula con papel y lpiz.

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)

En notacin polaca inversa la expresin:


(12 + 54) / (6 / 3)
equivale a:
12 54 + 6 3 / /
El programa que realiza el clculo de expresiones mediante notacin polaca inversa se basa en una
pila en la que se almacenan los valores y sus resultados aplicndole las operaciones. Utilizando la
pila de enteros el resultado es:
/**
* Universidad Carlos III de Madrid
* Ingeniera Tcnica Telecomunicaciones. Esp. Imagen y Sonido.
* Organizacin de Contenidos Audiovisuales.
*
* Ejemplo de clculo de notacin polaca inversa
*/
/**
*
* La expresin se viene por args en notacin polaca inversa,
* por ejemplo 12 54 + 6 3 / /
*/
class PolacaInversa
{
private String expresion[];

Jorge Ruiz Magaa

19

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales
/** Inicializamos correctamente la expresin */
PolacaInversa(String expresion[])
{
this.expresion = new String[expresion.length];
for (int i=0; i<expresion.length;i++)
this.expresion[i] = expresion[i];
}
/** Realiza los clculos segn expresion, utilizando una pila */
public int calcular()
{
// qu tamao hay que darle a la pila)
Pila pila = new Pila(expresion.length);
for (int i=0;i<expresion.length;i++)
{
if (esNumero(expresion[i]))
{
try
{
pila.apilar(Integer.parseInt(expresion[i]));
}
catch(Exception ex)
{
; // No puede haber excepcin pero lo indicamos por javac
}
}
else
{
// Sacamos los elementos y aplicamos resultado
int operando2 = pila.desapilar();
int operando1 = pila.desapilar();
if (expresion[i].equals("+"))
{
pila.apilar(operando1 + operando2);
}
else if (expresion[i].equals("-"))
{
pila.apilar(operando1 - operando2);
}
// Problemas si la divisin no es entera.
else if (expresion[i].equals("/"))
{
pila.apilar(operando1 / operando2);
}
else if (expresion[i].equals("*"))
{
pila.apilar(operando1 * operando2);
}
}
}
// El ltimo elemento debe ser el resultado.
return pila.desapilar();
}
public static void main(String args[])
{
// No olvidar hacer la comprobacin sobre args
PolacaInversa p = new PolacaInversa(args);
int resultado = p.calcular();
System.out.println("El resultado es: " + resultado);
// Para el ejemplo:
// 12 54 + 6 3 //
// da 33.
} // main
/** Nos dice si el string es un nmero. */
private boolean esNumero(String cadena)
{
try
{
int num = Integer.parseInt(cadena);

Jorge Ruiz Magaa

20

Universidad Carlos III de Madrid


Departamento de Ingeniera Telemtica
Organizacin de Contenidos Audiovisuales
return true;
}
catch(Exception ex)
{
return false;
}
} // EsNumero
} // PolacaInversa

Jorge Ruiz Magaa

21

También podría gustarte