La “pila” en C# (LIFO)

TAD pila (stack). Tipo Abstracto de Datos – PILA.


En una pila lo último que entra es lo primero que sale.

Necesitamos la librería System.Collections

using System;
// TADS fuertemente tipados
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// TADS pila, colas, etc.
using System.Collections;

namespace EjemploPila
{
    class Program
    {
        static void Main(string[] args)
        {
            string palabra;

            Stack miPila = new Stack();
            miPila.Push("hola");
            miPila.Push("buenos");
            miPila.Push("días");

            for (byte i = 0; i < 3; i++)
            {
                palabra = (string)miPila.Pop();
                Console.WriteLine(palabra);
            }

            Console.ReadKey();
        }
    }
}

Otros métodos, además del Push y Pop:

  1. Peek: mira el valor de la cabeza pero sin desapilar.
  2. Clear: borra todo el contenido de la pila.
  3. Contains: indica si un cierto elemento está en la pila.
  4. GetType: para saber de que tipo son los elementos almacenados en la pila.
  5. ToString: devuelve el elemento actual convertido en un string.
  6. ToArray. devuelve toda la pila convertida en un array.
  7. GetEnumerator: permite usar enumeradores para recorrer la pila.
  8. Count: indica cuantos elementos contiene.

Ejercicio: Simular una baraja de cartas, se sacan de forma aleatoria y se van apilando en una estructura “stack”. Luego de forma aleatoria se dice un número (siempre menor o igual al número de cartas) y se van sacando y mostrando todas las cartas que se sacan de la pila.

TAD cola (stack). Tipo Abstracto de Datos – COLA.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;

namespace EjemploCola
{
    class Program
    {
        static void Main(string[] args)
        {
            string palabra;

            Queue miCola = new Queue();
            miCola.Enqueue("Hola ");
            miCola.Enqueue("buenos ");
            miCola.Enqueue("días.");

            for (byte i = 0; i < 3; i++)
            {
                palabra = (string)miCola.Dequeue();
                Console.WriteLine(palabra);
            }

            Console.ReadKey();
        }
    }
}

Otros métodos además del Enqueue y Dequeue:

  1. Peek: mira el valor de la cabeza pero sin extraer.
  2. Clear: borra todo el contenido de la cola.
  3. Contains: indica si un cierto elemento está en la cola.
  4. GetType: para saber de que tipo son los elementos almacenados en la cola.
  5. ToString: devuelve el elemento actual convertido en un string.
  6. ToArray. devuelve toda la cola convertida en un array.
  7. GetEnumerator: permite usar enumeradores para recorrer la pila.
  8. Count: indica cuantos elementos contiene.

Ejercicio:

Desarrolle un programa en consola con un menú para el usuario que permita agregar elementos a una pila, eliminar elementos de la pila, vaciar la pila completa y mostrar la pila en pantalla, el programa solo debe aceptar números enteros del 1 al 99. Si el usuario introduce una opción que no existe o un valor erróneo el programa de avisar al usuario con un mensaje en pantalla y continuar con el programa.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace conStack
 {
     class Program
     {
         static void Main(string[] args)
         {
             Stack miPila = new Stack();
             int opcion;//opcion del menu 
             do{
                Console.Clear();//se limpia consola
                 opcion = menu();//muestra menu y espera opción
                 switch (opcion)
                {
                     case 1: 
                         agregar(ref miPila); 
                         break;
                     case 2: 
                         eliminar(ref miPila); 
                         break;
                     case 3: 
                         limpiar( ref miPila); 
                         break;
                     case 4: 
                         imprimir(miPila); 
                         break;
                     case 5: break; //salir
                     default:                        
                         mensaje("ERROR: la opción no es valida. Intente de nuevo.");
                         break;
                 }
             }
             while(opcion!=5);
             mensaje("El programa a finalizado.");            
         }
         /** añade un nuevo elemento a la pila */
         static void agregar( ref Stack pila )
         {
             Console.Write("\n>Ingrese valor: ");
             try
             {
                 int valor = Convert.ToInt32(Console.ReadLine());
                 if (valor > 99 || valor <= 0)
                 {
                     mensaje("Solo números del 1 al 99");
                 }
                 else
                 {
                     pila.Push(valor);
                     imprimir(pila);
                 }
             }
             catch {
                 mensaje("Error: Solo números del 1 al 99");
             }           
         } 
         /** Elimina todo los elementos de la pila */
         static void limpiar( ref Stack pila )
         {
             pila.Clear();
             imprimir(pila);
         }
         /** Elimina elemento de la pila */
         static void eliminar( ref Stack pila)
         {
             if (pila.Count > 0)
             {
                 int valor = (int)pila.Pop();                
                 mensaje("Elemento " + valor + " eliminado");
             }
             else {
                 imprimir(pila);
             }   
         }
         /** muestra menu y retorna opción */
         static int menu()
         {
             //Console.Clear();
             Console.WriteLine("\n            Stack Menu\n");
             Console.WriteLine(" 1.- Agregar elemento");
             Console.WriteLine(" 2.- Eliminar elemento");
             Console.WriteLine(" 3.- Vaciar Pila");
             Console.WriteLine(" 4.- Ver pila");
             Console.WriteLine(" 5.- Termina programa");
             Console.Write(" JJ:> Ingresa tu opción: ");            
             try
             {
                 int valor = Convert.ToInt32( Console.ReadLine() );                
                 return valor;
             }
             catch {
                 return 0;
             }            
         }
 
         /** Muestra mensaje del programa al usuario */
         static void mensaje( String texto )
         {
             if (texto.Length > 0)
             {
                 Console.WriteLine("\n    =======================================================");
                 Console.WriteLine(" JJ:> {0}",texto);
                 Console.WriteLine(" =======================================================");
                 Console.WriteLine("\n    JJ:>Presione cualquier tecla para continuar...");
                 Console.ReadKey();
             }            
         }
 
         /** Imprime pila */
         static void imprimir(Stack pila)
         {
             if (pila.Count > 0)
             {
                 Console.WriteLine("");
                 foreach (int dato in pila)
                 {
                     Console.WriteLine(" | |");
                     if( dato <10)
                         Console.WriteLine(" | 0{0} |", dato);
                     else
                         Console.WriteLine(" | {0} |", dato);
                     Console.WriteLine(" |______|");
                 }
                 Console.WriteLine("\nPresione cualquier tecla para continuar ...");
                 Console.ReadKey();
             }
             else 
             {
                 mensaje("La Pila esta vacia");                
             }
         }
     }
}