PILAS
Las pilas (Stack<T>) en C# son
colecciones genéricas que siguen el principio LIFO (Last In, First Out), donde
el último elemento en entrar es el primero en salir. Se definen en
System.Collections.Generic, permitiendo añadir (Push), eliminar (Pop) y mirar
(Peek) elementos eficientemente en tiempo
, ideales para deshacer acciones o
recursividad.
bravedeveloper.com
bravedeveloper.com
+4
Características y Operaciones Principales:
LIFO: El elemento en la cima es el primero
en salir.
Push(T item): Añade un elemento a la parte
superior.
Pop(): Elimina y devuelve el elemento
superior.
Peek(): Devuelve el elemento superior sin
eliminarlo.
Count: Obtiene el número de elementos.
Clear(): Elimina todos los elementos.
CODIGO:
using System;
// 1. CLASE NODO - Igual que en la cola
public class Nodo
{
public int dato;
public Nodo siguiente;
public Nodo(int valor)
{
dato = valor;
siguiente = null;
}
}
// 2. CLASE PILA - Solo necesita UN puntero
public class PilaSimple
{
private Nodo cima; // Único
puntero necesario (topo de la pila)
// 3. CONSTRUCTOR
public PilaSimple()
{
cima = null; // Pila vacía
}
// 4. PUSH - Agrega a la CIMA ✓ O(1)
public void Push(int valor)
{
Nodo nuevo = new Nodo(valor);
// Nuevo nodo
nuevo.siguiente = cima;
// Apunta a la cima anterior
cima = nuevo;
// Nuevo nodo es la nueva cima
}
// 5. POP - Quita de la CIMA ✓ O(1)
public int Pop()
{
if (cima == null)
{
Console.WriteLine("Pila vacía");
return -1;
}
int valor = cima.dato; //
Guardar valor de la cima
cima = cima.siguiente; //
Bajar una posición
return valor; // Devolver elemento quitado
}
// 6. PEEK - Ver cima sin quitar
public int Peek()
{
if (cima == null)
{
Console.WriteLine("Pila vacía");
return -1;
}
return cima.dato;
}
// 7. MOSTRAR - De cima hacia abajo
public void Mostrar()
{
Nodo actual = cima;
Console.Write("Pila: ");
while (actual != null)
{
Console.Write(actual.dato + " ← ");
actual = actual.siguiente;
}
Console.WriteLine("null");
}
}
// 8. PRUEBA
class Program
{
static void Main()
{
PilaSimple pila = new PilaSimple();
pila.Push(10);
pila.Push(20);
pila.Push(30);
pila.Mostrar(); // Pila: 30 ← 20
← 10 ← null
pila.Pop(); // Quita 30
pila.Mostrar(); // Pila: 20 ← 10
← null
}
}
APLICACIÓN DE COLAS
CLASE NODO:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SISTEMA_DE_COLAS
{
public class Nodo
{
public int dato;
public Nodo siguiente;
public Nodo(int valor)
{
dato = valor;
siguiente = null;
}
}
}
CLASE COLAS:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SISTEMA_DE_COLAS
{
public class Cola
{
private Nodo inicio;
private Nodo fin;
private int tamaño;
public Cola()
{
inicio = null;
fin = null;
tamaño = 0;
}
public void Encolar(int valor)
{
Nodo nuevo = new Nodo(valor);
if (estaVacia())
{
inicio = nuevo;
fin = nuevo;
}
else
{
fin.siguiente = nuevo;
fin = nuevo;
}
tamaño++;
}
public int Desencolar()
{
if (estaVacia())
{
System.Windows.Forms.MessageBox.Show("¡La cola está vacía!");
return -1;
}
int valor = inicio.dato;
inicio = inicio.siguiente;
if (inicio == null) fin = null;
tamaño--;
return valor;
}
public int Peek()
{
if (estaVacia())
{
System.Windows.Forms.MessageBox.Show("¡La cola está vacía!");
return -1;
}
return inicio.dato;
}
public bool estaVacia() => inicio == null;
public int Tamano() => tamaño;
public string Mostrar()
{
if (estaVacia())
return "Cola vacía";
System.Text.StringBuilder sb = new
System.Text.StringBuilder();
Nodo actual
= inicio;
while (actual != null)
{
sb.Append(actual.dato + "
");
actual = actual.siguiente;
}
return sb.ToString().Trim();
}
}
}
FORM1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using
System.Threading.Tasks;
using
System.Windows.Forms;
namespace SISTEMA_DE_COLAS
{
public partial class Form1 : Form
{
private Cola miCola; // ← Esta
línea es OBLIGATORIA
public Form1()
{
InitializeComponent();
miCola = new Cola(); //
Inicializar la cola
ActualizarInterfaz();
}
private void
btnEncolar_Click(object sender, EventArgs e)
{
if
(int.TryParse(txtNumero.Text, out int numero))
{
miCola.Encolar(numero); // Ahora sí reconoce miCola
txtNumero.Clear();
ActualizarInterfaz();
}
else
{
MessageBox.Show("¡Ingrese
un número válido!");
}
}
private void
btnDesencolar_Click(object sender, EventArgs e)
{
int resultado = miCola.Desencolar();
if (resultado != -1)
{
MessageBox.Show($"Elemento
removido: {resultado}");
ActualizarInterfaz();
}
}
private void
btnPeek_Click(object sender, EventArgs e)
{
int primero = miCola.Peek();
if (primero != -1)
{
MessageBox.Show($"Primer
elemento: {primero}");
}
}
private void
btnLimpiar_Click(object sender, EventArgs e)
{
miCola = new Cola(); // Reinicia
la cola
ActualizarInterfaz();
}
private void ActualizarInterfaz()
{
lstCola.Items.Clear();
lstCola.Items.Add(miCola.Mostrar());
lblTamano.Text = $"Tamaño: {miCola.Tamano()}";
txtNumero.Focus();
}
}
}

