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 C#).
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Collections;
namespace FileTextQueue
{
class Program
{
static void Main(string[] args)
{
Console.Write("Introduce el nombre del archivo: ");
string nombreFichero = Console.ReadLine();
if (!File.Exists(nombreFichero))
{
Console.Write("El archivo no existe");
return;
}
try
{
bool depurando = true;
StreamReader ficheroTexto;
ficheroTexto = File.OpenText(nombreFichero);
string line = " ";
Queue micola = new Queue();
do
{
line = ficheroTexto.ReadLine();
if (line != null)
micola.Enqueue(line);
}
while (line != null);
ficheroTexto.Close();
Stack miPila = new Stack();
int numero1 = 0, numero2 = 0;
int cantidadCola = micola.Count;
string valorCola;
string[] valores_linea;
for (int i = 0; i < cantidadCola; i++)
{
valorCola = (string)micola.Dequeue();
valores_linea = valorCola.Split(' ');
for (int c = 0; c < valores_linea.Length; c++)
{
switch (valores_linea[c])
{
case "+":
numero1 = Convert.ToInt32(miPila.Pop());
numero2 = Convert.ToInt32(miPila.Pop());
miPila.Push(numero2 + numero1);
break;
case "-":
numero1 = Convert.ToInt32(miPila.Pop());
numero2 = Convert.ToInt32(miPila.Pop());
miPila.Push(numero2 - numero1);
break;
case "*":
numero1 = Convert.ToInt32(miPila.Pop());
numero2 = Convert.ToInt32(miPila.Pop());
miPila.Push(numero2 * numero1);
break;
case "/":
numero1 = Convert.ToInt32(miPila.Pop());
numero2 = Convert.ToInt32(miPila.Pop());
miPila.Push(numero2 / numero1);
break;
default:
// Almacenamos valores enteros
miPila.Push(valores_linea[c]);
break;
}
}
for (int j = 0; j < miPila.Count; j++)
{
Console.WriteLine(miPila.Pop());
}
}
if (depurando)
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine("Error, " + e.Message);
}
}
}
}