Exercise
Queue Stack Reverse Polish Notation
Objetive
Create a program that reads a Reverse Polish Notation expression from a text file, for example:
3 4 6 5 - + * 6 +
(Result 21)
Each item will be stored in a queue. Once the queue has all the items stored, you will need to transfer them from the queue to a stack using the Queue and Stack classes provided in Visual Basic (VB.Net).
Finally, you will operate with the stack to get the correct result of the RPN expression and show it on the console.
Code
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