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 Visual Basic).
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
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Collections
Namespace FileTextQueue
Class Program
Private Shared Sub Main(ByVal args As String())
Console.Write("Introduce el nombre del archivo: ")
Dim nombreFichero As String = Console.ReadLine()
If Not File.Exists(nombreFichero) Then
Console.Write("El archivo no existe")
Return
End If
Try
Dim depurando As Boolean = True
Dim ficheroTexto As StreamReader
ficheroTexto = File.OpenText(nombreFichero)
Dim line As String = " "
Dim micola As Queue = New Queue()
Do
line = ficheroTexto.ReadLine()
If line IsNot Nothing Then micola.Enqueue(line)
Loop While line IsNot Nothing
ficheroTexto.Close()
Dim miPila As Stack = New Stack()
Dim numero1 As Integer = 0, numero2 As Integer = 0
Dim cantidadCola As Integer = micola.Count
Dim valorCola As String
Dim valores_linea As String()
For i As Integer = 0 To cantidadCola - 1
valorCola = CStr(micola.Dequeue())
valores_linea = valorCola.Split(" "c)
For c As Integer = 0 To valores_linea.Length - 1
Select Case valores_linea(c)
Case "+"
numero1 = Convert.ToInt32(miPila.Pop())
numero2 = Convert.ToInt32(miPila.Pop())
miPila.Push(numero2 + numero1)
Case "-"
numero1 = Convert.ToInt32(miPila.Pop())
numero2 = Convert.ToInt32(miPila.Pop())
miPila.Push(numero2 - numero1)
Case "*"
numero1 = Convert.ToInt32(miPila.Pop())
numero2 = Convert.ToInt32(miPila.Pop())
miPila.Push(numero2 * numero1)
Case "/"
numero1 = Convert.ToInt32(miPila.Pop())
numero2 = Convert.ToInt32(miPila.Pop())
miPila.Push(numero2 / numero1)
Case Else
miPila.Push(valores_linea(c))
End Select
Next
For j As Integer = 0 To miPila.Count - 1
Console.WriteLine(miPila.Pop())
Next
Next
If depurando Then Console.ReadLine()
Catch e As Exception
Console.WriteLine("Error, " & e.Message)
End Try
End Sub
End Class
End Namespace