Notación Polish inversa de pila de cola Aprende programación con ejercicios Java

Lección:

Gestión Dinámica de Memoria


Ejercicio:

Notación Polish inversa de pila de cola 78


Objetivo:

Cree un programa que lea desde un archivo de texto una expresión en notación polaca inversa como, por ejemplo:

3 4 6 5 - + * 6 +
(Resultado 21)

Cada elemento se almacenará en una cola.

Una vez que la cola tenga todos los elementos almacenados, tendrá que almacenarlos de la cola a una pila (utilizando la clase Queue y Stack proporcionadas en java).

Finalmente, operarás con la pila para obtener el resultado correcto de la expresión en RPN, y la mostrarás por consola.


Código:

package FileTextQueue;
import java.util.*;
public class Main
{
	public static void main(String[] args)
	{
		System.out.print("Introduce el nombre del archivo: ");
		String nombreFichero = new Scanner(System.in).nextLine();

		if (!(new java.io.File(nombreFichero)).isFile())
		{
			System.out.print("El archivo no existe");
			return;
		}

		try
		{
			boolean depurando = true;

			java.io.FileReader ficheroTexto;
		    java.io.BufferedReader ficheroTextoBufferedReader = 
            new java.io.BufferedReader(ficheroTexto);

			ficheroTexto = new java.io.FileReader(nombreFichero);
			String line = " ";

			LinkedList micola = new LinkedList();

			do
			{
				line = ficheroTextoBufferedReader.readLine();
				if (line != null)
				{
					micola.offer(line);
				}
			} while (line != null);

			ficheroTexto.close();

			Stack miPila = new Stack();

			int numero1 = 0, numero2 = 0;

			int cantidadCola = micola.size();

			String valorCola;
			String[] valores_linea;

			for (int i = 0; i < cantidadCola; i++)
			{
				valorCola = (String)micola.poll();
				valores_linea = valorCola.split("[ ]", -1);

				for (int c = 0; c < valores_linea.length; c++)
				{
					switch (valores_linea[c])
					{
						case "+":
							numero1 = (int)miPila.pop();
							numero2 = (int)miPila.pop();

							miPila.push(numero2 + numero1);

							break;
						case "-":
							numero1 = (int)miPila.pop();
							numero2 = (int)miPila.pop();

							miPila.push(numero2 - numero1);
							break;
						case "*":
							numero1 = (int)miPila.pop();
							numero2 = (int)miPila.pop();

							miPila.push(numero2 * numero1);
							break;
						case "/":
							numero1 = (int)miPila.pop();
							numero2 = (int)miPila.pop();

							miPila.push(numero2 / numero1);
							break;
						default:
							// Almacenamos valores enteros
							miPila.push(valores_linea[c]);
							break;
					}
				}

				for (int j = 0; j < miPila.size(); j++)
				{
					System.out.println(miPila.pop());
				}
			}

			if (depurando)
			{
				new Scanner(System.in).nextLine();
			}
		}

		catch (RuntimeException e)
		{
			System.out.println("Error, " + e.getMessage());
		}
	}
}