Notación Polish inversa de pila de cola Curso de Programación Visual Basic

Lección:

Gestión Dinámica de Memoria


Ejercicio:

Notación Polish inversa de pila de cola 9


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