Ejercicio
Notación Polish inversa de pila de cola
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 de Ejemplo
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());
}
}
}