/**
  * Pila
  */
class Pila
{
	/** Máximo número de elementos a insertar en la pila*/
	private int numElementos;
	      
	/** Almacén de datos en el que se insertan los elementos **/
	private int elementos[];
	/** Referencia al último elemento insertado. */
	private int indice;
	
	/** Inicalización 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 ++;
		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 número de elementos que tiene la pila */
	public int numElementos()
	{
		return indice+1;
	}
	
	/** Imprime los elementos de la pila */
	public void imprimir()
	{
		for (int i=0; i<=indice; i++)
			System.out.print(elementos[i] + "-");
		System.out.println();	
	}

} // Pila


/*
  * Soluciones
  */  
class Solucion
{


	/** 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 [])
	{
		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 . ¿podría 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 . ¿podría 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

	/** Cálculo del mayor de los enteros */
	public void ejercicio5()
	{
		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 5
	
	// Ejercicio 6. Sumatorio
	public void ejercicio6()
	{
		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);
	
	} // Ejercicio6
	
	// Media de los elementos
	public void ejercicio7()
	{
		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 precisión.
		double media = (double)sumatorio/(double)200;
		System.out.println("la media es: " + media);
	}
	
	// Recorrido circular.
	public void ejercicio8()
	{
		int elementos [] = new int[10];
		int i = 0;
		int indice = 0;
		
		// Cargamos el array
		for (i=0;i<10;i++) 	elementos[i] = i+1;
		
		
		// Lo recorremos 2 veces. 
		int j = 0;
		for (i=0;i<20;i++)
		{
			System.out.println(elementos[j]);
			if (j==9) 
				j=0;
			else 
				j++;
		}
	} // Recorrido circular.

	// mostramos los pares de un array
	public void ejercicio9()
	{
		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]);
		}
	}
	
	// Tablero de ajedrez con array de dos dimensiones.
	public void ejercicio10()
	{
		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();
		}
	}
	
	/**
	  * Prueba para los ejercicios del tema 8.
	  */
	public static void main(String [] args)
	{
		Solucion sol = new Solucion();
		
		int numElementos = 5;
		
		sol.ejercicio1(numElementos);
		int elementos [] = {1,2,3,4,5};
		sol.ejercicio2(elementos);
		sol.ejercicio3(elementos);		
		sol.ejercicio4(elementos);		
		sol.ejercicio5();				
		sol.ejercicio6();
		sol.ejercicio7();
		sol.ejercicio8();
		sol.ejercicio9();
		sol.ejercicio10();
		
	}
} // Solucion
