Estrutura de Dados - Pilha
A Pilha
A pilha, sem dúvida, é uma das estruturas de dados mais importantes no campo da ciência da computação e, ao mesmo tempo, simples de entender e implementar.
Vemos essa estrutura de dados no nosso dia a dia, como empilhar livros em uma prateleira, caixas em um armazém e até mesmo contêineres empilhados. Na ciência da computação, a encontramos no histórico do navegador, ao desfazer ou refazer uma alteração em um texto com Ctrl + Z e Ctrl + Y, ou no histórico de operações de uma calculadora, entre outras aplicações. A pilha segue o conceito de LIFO (Last In, First Out), que em português significa “último a entrar, primeiro a sair.”
Operações com Pilha
A pilha suporta 4 operações básicas:
Push
: Um novo elemento é colocado no topo da pilha.Pop
: Remove o elemento do topo da pilha.Top (ou Peek)
: Permite acessar o elemento no topo da pilha sem removê-lo.isEmpty
: Verifica se a pilha está vazia.Size (ou tamanho)
: Essa operação retorna o número de elementos na pilha no momento.
Agora, embarquemos na implementação em C#.
No C#, temos uma classe que representa uma coleção no namespace System.Collections
, e essa classe simplifica todas as operações relacionadas à pilha.
Criando a Pilha
Para criar uma pilha em C# com a classe Stack, temos três construtores:
Stack()
: Que cria uma nova instância vazia da classe com capacidade padrão.Stack(ICollection)
: Que cria uma nova instância da classe com elementos de outra coleção com a mesma capacidade da coleção copiada.Stack(Int32)
: Que cria uma nova instância da classe que está vazia e tem um espaço inicial específico ou o espaço inicial padrão, o que for maior.
Inserindo elementos na Pilha com Push
O método Push insere um elemento no topo da pilha, podendo esse ser nulo.
1
public virtual void Push (object? obj);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Collections;
public class Program {
public static void Main() {
Stack frutas = new Stack();
frutas.Push("Banana");
frutas.Push("Maçã");
frutas.Push("Melancia");
foreach(var fruta in frutas) {
Console.WriteLine("Fruta: {0}", fruta);
}
}
}
Saída:
- Fruta: Melancia
- Fruta: Maçã
- Fruta: Banana
Removendo elementos na Pilha com Pop
O método Pop remove um elemento do topo da pilha, alterando assim o seu tamanho, ao contrário do método Peek() que apenas recupera o elemento do topo sem alterar o tamanho da pilha.
1
public virtual object? Pop ();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
using System.Collections;
public class Program {
public static void Main() {
Stack frutas = new Stack();
frutas.Push("Banana");
frutas.Push("Maçã");
frutas.Push("Melancia");
var fruta = frutas.Pop();
Console.WriteLine("Fruta: {0}", fruta);
}
}
Saída:
- Fruta: Melancia
Pegando elementos do topo da Pilha com Peek
O método Peek retorna o elemento do topo da pilha sem modificar o tamanho da pilha, ao contrário do método Pop que retorna e remove o elemento do topo da pilha.
1
public virtual object? Peek ();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Collections;
public class Program {
public static void Main() {
Stack frutas = new Stack();
frutas.Push("Banana");
frutas.Push("Maçã");
frutas.Push("Melancia");
var fruta_top = frutas.Peek();
Console.WriteLine("Qual a fruta está no topo da pilha: {0}", fruta_top);
foreach(var fruta in frutas) {
Console.WriteLine("Fruta: {0}", fruta);
}
}
}
Saída:
- Qual a fruta está no topo da pilha: Melancia
- Fruta: Melancia
- Fruta: Maçã
- Fruta: Banana
Verificando se a pilha está vazia
A classe Stack do C# não tem um método isEmpty, mas ainda sim podemos verificar se a pilha está vazia com a propriedade Count que retorna o número de elementos que compõe a pilha, ou seja, o tamanho e caso seja igual a zero, a pilha estará vazia.
1
public virtual int Count { get; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections;
public class Program {
public static void Main() {
Stack frutas = new Stack();
frutas.Push("Banana");
frutas.Push("Maçã");
frutas.Push("Melancia");
frutas.Pop();
frutas.Pop();
frutas.Pop();
if (frutas.Count == 0) {
Console.WriteLine("A Pilha está vazia");
} else {
Console.WriteLine("A Pilha contém {0} elemento(s)", frutas.Count);
}
}
}
Saída:
- A Pilha está vazia
Referências: https://learn.microsoft.com/pt-br/dotnet/api/system.collections.stack?view=net-7.0