Pilas Y Colas en Visual Basic .Net Leido 32.099 veces

 
  Invitado
Pregunta ofrece:
1 estrellas
Necesito ayuda con un trabajo para la facu!! tengo que hacer unos trabajos con pilas y colas. Quiero hacerlas con VB .Net y la verdad no se como comenzar. Necesito algún programa sencillo de pilas o colas con el que pueda guiarme(aunque no este en Visual). Desde ya muchas garcias =)
 

 





  killbill07
Hola Juan! Voy a tratar de ayudarte con lo de las pilas y las colas. Lo primero para que te des una idea general del asunto, es que para usar pilas en Vb.Net debés importar la clases Stack, que está en System...Bueno mejor vamos a ver primero el asunto de las pilas, no quiero marearte. Las pilas son de la clase Stack (justamente, pila) y sirven para entrar valores que después serán devueltos en LIFO (Last In First Out: Primero en entrar, último en salir). O sea que el primer valor que metamos va a ser el último en salir, y el último en entrar va a ser el primero en salir. Ahora cuando lo veamos abajo, se va a enteder mejor. Abrí Visual Basic.Net y creá una nueva aplicación de consola, y pegá el código de abajo. Después ejecutalo para que puedas ver el resultado. Ojo, antes leelo sino no tiene gracia XD



Imports System
Imports System.Collections
Imports Microsoft.VisualBasic

Public Class MuestraPila

Public Shared Sub Main()

' Crea e inicializa una nueva pila
Dim miPila As New Stack()
miPila.Push("Hola")
miPila.Push("mundo")
miPila.Push("!")

' Muestra las propiedades y valores de la pila
Console.WriteLine("miPila")
Console.WriteLine(ControlChars.Tab & "Cuenta: {0}", miPila.Count)
Console.Write(ControlChars.Tab & "Valores:")
ImprimeValores(miPila)
Console.ReadLine()
End Sub

Public Shared Sub ImprimeValores(myCollection As IEnumerable)
Dim obj As [Object]
For Each obj In myCollection
Console.Write(" {0}", obj)
Next obj
Console.WriteLine()
End Sub 'ImprimeValores
End Class

' Este codigo produce la siguiente salida
'
' miPila
' Cuenta: 3
' Valores: ! mundo Hola


Como podrás ver, este código no fue escrito por mí, sino que lo extraje de MSDN y le cambié los nombres a cada cosa para "castellanizarlo" y que sea más entendible.
Siempre es bueno consultar MSDN cuando tengas estas dudas. Te dejo dos links:
Clase Stack
Clase Queue
Hay sólo una cosa que corregí, que los muchachos de Microsoft deberían tener bien en claro: Agregué Console.ReadLine() ya que sino la ventana se cierra tan rápido que no podemos ni verla. Sigamos con la explicación.
Como ves, para "meter" valores en una pila usamos push. Los valores se imprimen de atrás para adelante, sería como hacer una cuenta regresiva. Si quisieras, podrías armar una cuenta regresiva con números. Pero tendrías que hacer como 10 líneas con lo mismo, cambiando sólo los números. O podés hacer...mmm mejor te lo voy a dejar como ejercicio para que lo pienses vos, después subís el resultado y si no te sale me decís y te lo muestro.
Ahora es cuando más vamos a ver la diferencia entre pila y consulta, mirá este ejemplo:



Imports System
Imports System.Collections

Public Class MuestraQueue

Public Shared Sub Main()

' Crea e inicializa una nueva consulta o Queue
Dim miQ As New Queue()
miQ.Enqueue("Hola")
miQ.Enqueue("mundo")
miQ.Enqueue("!")

' Muestra las propiedades y valores del queue
Console.WriteLine("miQ")
Console.WriteLine(" Cuenta: {0}", miQ.Count)
Console.Write(" Valores:")
ImprimeValores(miQ)
Console.ReadLine()

End Sub 'Main

Public Shared Sub ImprimeValores(myCollection As IEnumerable)
Dim obj As [Object]
For Each obj In myCollection
Console.Write(" {0}", obj)
Next obj
Console.WriteLine()
End Sub 'ImprimeValores

End Class 'MuestraQueue

' Este código tiene la siguiente salida:
'
' miQ
' Cuenta: 3
' Valores: Hola mundo !


En definitiva: Queue cuenta en el orden común, y las pilas del último a primero. Si ponemos "Hola mundo!" como hicimos, queue devuelve Hola mundo! y las pilas devuelven ! mundo Hola. Espero que quede claro y te ayude. Saludos.

 

 


  Jesús Rubén
Ha recibido:
1 premios
Como hay varias personas que preguntan sobre lo mismo, ampliaré un poco lo que dice Mariela.

Para acordarnos es muy sencillo, si pensamos en una cola, como si fuese una cola para ir al cine, el siguiente que entra en la cola, se pone el último de la fila y van saliendo de la cola (entrando al cine) en orden en el que llegaron.

Para acordarnos de las pilas, imaginamos una pila de platos, vamos poniendolos unos encima de otros conforme los sacamos del lavavajillas, por supuesto cuando quieremos sacar uno de la pila, siempre sacaremos el de arriba, usease, el último plato que ha entrado.

Con estos dos truquitos, seguro que ya no tienes problemas en diferenciarlos.

Ahora aclararemos que estas dos clases son colecciones, las colecciones en .net Framework son listas de objetos, como todo hereda de la clase objeto ya que es la base de herencia de todas las clases de .net Framework, podemos meter cualquier cosa.

Para aumentar el rendimiento y quitarle un poco de trabajo al typecast, se recomienda indicar el tipo de clases que vamos a meter en la colección.

Ejemplo:




Dim MiPila As Stack(Of String)



He definido que la pila MiPila va a contener sólo clases de tipo String. Por lo que sólo podré meter cadenas de texto en esa colección, esto optimizará muchísimo el código, ya que podemos asignar la referencia del objeto directamente sin tener que hacer un cast (conversión de tipos).

Cuando hablamos de colecciones no podemos dejarnos de lado la maestra de las colecciones, mi colección favorita y la más usada pro todos. El Dictionary. El dictionary tiene la peculiaridad de que le podemos meter una clave, por la cual podremos consultar un elemento con el parámetro ContainsKey, y el SortedDictionary es más avanzado, pero consume más al añadir un elemento, ya que tiene que ordenar el hashtable.

Os pongo un ejemplito de un dictionary:




Dim MiDiccionario As Dictionary(Of Integer, String) = New Dictionary(Of Integer, String)
MiDiccionario.Add(1, "Hola")
MiDiccionario.Add(2, "Mundo")

Dim MiString$ = MiDiccionario(1) 'Meto Hola dentro de MiString

If MiDiccionario.ContainsKey(2) Then 'Reviso que contenga la clave 2
Dim MiString2$ = MiDiccionario(2) 'Meto Mundo dentro de MiString
End If



Si es un SortedDictionary lo podemos recorrer de forma ordenada.

Aviso importante sobre mutithread:
No se os ocurra eliminar o añadir elementos de un diccionario o cualquier colección mientras estaís haciendo un foreach. Si necesitaís modificar una colección mediante otro thread, hay que siempre usar un Mutex o un Interlocked de operación atómica, dependiendo de la necesidad.

 

 


  Invitado
esos programitas no hacen nada
los compile en vb 2010 y no pasa nada al correrlos en consola

 

 


  Joel Herrera
necesito ayuda con pila y cola yo ya tengo todo los codigos

el problema q quiero resolver es que si escribo una letra q no se encuentra me envie un msgbox q diga q no se encuentra y las letras q tngo se queden en el listbox sin q se borren

el q me quiera ayudar me puede escribir a mi correo : trueblackmetal9@gmail.com

spero su ayuda

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

ListBox1.Items.Add("7")
ListBox1.Items.Add("9")
ListBox1.Items.Add("10")
ListBox1.Items.Add("12")
ListBox1.Items.Add("15")

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

ListBox2.Items.Add("A")
ListBox2.Items.Add("a")
ListBox2.Items.Add("B")
ListBox2.Items.Add("c")
ListBox2.Items.Add("D")

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Dim a As Integer
For a = 0 To ListBox2.Items.Count - 1
If TextBox1.Text = ListBox2.Items.Item(0) Then
ListBox2.Items.RemoveAt(0)
Exit For
Else
ListBox2.Items.RemoveAt(0)
End If
Next
If ListBox2.Items.Count = "0" Then
MsgBox("no element")
End If
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim b As Integer
For b = 0 To ListBox1.Items.Count - 1
If ListBox1.Text = ListBox1.Items.Item(ListBox1.Items.Count - 1) Then
ListBox1.Items.RemoveAt(ListBox1.Items.Count - 1)
Exit For
Else
ListBox1.Items.RemoveAt(ListBox1.Items.Count - 1)
End If
Next b
If ListBox1.Items.Count = "0" Then
MsgBox("no element")
End If
End Sub
End Class

 

 








    ¿Cuantas columnas?     | 2 columnas | 3 columnas | 4 columnas | 5 columnas | 6 columnas |  
    Escribe la dirección web de la imagen:
  Publica tu respuesta  |  Haz Click en el siguiente cuadro para escribir