Veremos hoje uma introdução a estrutura de dados na linguagem C#. |
Uma estrutura de dados é um formato
especializado para organizar, processar, recuperar e armazenar dados. Existem
vários tipos básicos e avançados de estruturas de dados, todos projetados para
organizar os dados para atender a uma finalidade específica.
As estrutura de dados facilitam o acesso e
o trabalho dos usuários aos dados de que precisam de maneira apropriada; Como exemplos de
estruturas de dados temos: arrays,
Linked List, Stack, Queue, etc.
A escolha de uma boa estrutura de dados torna possível realizar uma variedade de operações críticas de forma eficaz, e, uma estrutura de dados eficiente também usa espaço mínimo de memória e tempo de execução para processar a estrutura.
Uma estrutura de dados também define uma instância de ADT
(ABSTRACT DATA TYPE) que é formalmente definido como um trio:
[D,F,A], onde :
D: Conjunto de domínio;
F: o conjunto de operações
A: o conjunto de axiomas;
A necessidade das
estrutura de dados
A estrutura dos dados e a síntese do algoritmo são relativas entre si. A
apresentação dos dados deve ser de fácil compreensão para que o desenvolvedor,
assim como o usuário, possa fazer uma implementação eficiente da operação.
As estruturas de dados fornecem uma maneira fácil de organizar, recuperar,
gerenciar e armazenar dados.
Os principais motivos para usar estrutura de dados:
- A modificação da estrutura de dados é fácil;
- Requer menos tempo;
- Economizar espaço de memória de armazenamento;
- A representação de dados é fácil;
A classificação e
os tipos de Estruturas de Dados
Podemos ter:
Estrutura de
dados linear
Os elementos são organizados em uma dimensão, também conhecida como dimensão
linear.
Exemplo: listas, pilha, fila, etc.
Estrutura de
dados não linear
Os elementos são organizados em dimensões um-muitos, muitos-um e
muitos-muitos.
Exemplo: árvore, gráfico, tabela, etc.
A importância da complexidade dos algoritmos é dada pelo
fato de que ela nos diz se o código está escalável. A maioria das estruturas de
dados e algoritmos fundamentais já estão implementados na plataforma .NET, é
importante saber como essas estruturas de dados funcionam e qual o tempo,
complexidade de memória que elas possuem para as operações
básicas: elemento de
acesso, elemento de busca, elemento de exclusão, elemento de adição.
A seguir veremos as estrutura de dados mais populares na plataforma .NET.
1- Stack
Stack ou Pilha é uma estrutura de dados implementada de duas maneiras, pilha simples no namespace System.Collections e pilha como estrutura de dados genérica no namespace System.Collections.Generic, o princípio da operação da estrutura da pilha é LIFO (último a entrar, primeiro a sair) ), o último elemento inserido é o primeiro que sai.
Stack ou Pilha é uma estrutura de dados linear que segue uma ordem particular na qual as operações são executadas. A ordem pode ser LIFO (Last In First Out) ou FILO (First In Last Out). Na pilha, todas as inserções e exclusões são permitidas em apenas uma extremidade da lista.
Exemplo de uma Stack bem simples :
using
System.Collections;// Cria e inicializa uma nova Stack.
Stack minhaStack = new Stack();
minhaStack.Push("Macoratti");
minhaStack.Push(".net");
minhaStack.Push(" 2022");
// Exibe as propriedades e valores das Stack.
Console.WriteLine("minhaStack\n");
Console.WriteLine($"\tQuantidade :\t {minhaStack.Count}");
Console.Write("\tValores: ");
foreach (Object obj in minhaStack)
Console.Write($"\t{obj}");
|
Usando a coleção System.Collections.Generic podemos fazer assim:
Stack<string> numeros = new Stack<string>();
numeros.Push("um");
numeros.Push("dois");
numeros.Push("três");
numeros.Push("quatro");
numeros.Push("cinco");
foreach (string numero in numeros)
{
Console.WriteLine(numero);
}
|
As operações básicas a seguir são executadas na pilha:
Initialize : Torna uma pilha vazia.
Push: Adiciona um item na pilha. Se a pilha estiver cheia, diz-se que é uma condição de estouro;
Pop: Remove um item da pilha. Os itens são exibidos na ordem inversa em que são enviados. Se a pilha estiver vazia, diz-se que é uma condição de Underflow;
Peek ou Top: Retorna o elemento superior da pilha;
isEmpty: Retorna true se a pilha estiver vazia, caso contrário, false;
Aplicações e usos do recurso Stack:
Funcionalidade desfazer/refazer(Undo)
Inversão de palavras;
Empilhar para trás/frente em navegadores
Algoritmos de retrocesso;
Verificação de colchetes;
2. Queue
Assim como a Pilha, a Fila é uma estrutura linear que segue uma ordem específica na qual as operações são executadas. A ordem é First In First Out (FIFO).
Na fila, os itens são inseridos em uma extremidade e excluídos na outra extremidade. Um bom exemplo de fila é qualquer fila de consumidores para um recurso em que o consumidor que veio primeiro é atendido primeiro. A diferença entre pilhas e filas está na remoção.
Em uma pilha, removemos o item adicionado mais recentemente; em uma fila, removemos o item adicionado menos recente.
Exemplo de implementação usando uma fila simples usando o namespace System.Collections:
Queue minhaFila = new Queue();
minhaFila.Enqueue("Macoratti");
minhaFila.Enqueue(".net");
minhaFila.Enqueue(" 2022");
Console.WriteLine("minhaFila\n");
Console.WriteLine($"\tQuantidade :\t {minhaFila.Count}");
Console.Write("\tValores: ");
foreach (Object obj in minhaFila)
Console.Write($"\t{obj}");
|
Principais operações realizadas em uma Queue ou Fila :
Enqueue: Adiciona um item à fila. Se a fila estiver cheia, diz-se que é uma condição de estouro;
Dequeue: Remove um item da fila. Os itens são exibidos na mesma ordem em que são enviados. Se a fila estiver vazia, diz-se que é uma condição de Underflow;
Front: Pegue o item da frente da fila;
Rear: Pegue o último item da fila;
3. LinkedList
Assim como os arrays, a Linked List(lista encadeada) é uma estrutura de dados linear. Ao contrário dos arrays, os elementos da lista encadeada não são armazenados em um local contíguo; os elementos são vinculados usando ponteiros.
O princípio de funcionamento das estruturas de lista encadeada é que cada nó da lista tem uma referência ao próximo nó, exceto a cauda da lista, que não tem referência ao próximo nó.
Exemplo de implementação simples:
LinkedList<string> meses = new LinkedList<string>();
meses.AddLast("Março");
meses.AddFirst("Janeiro");
var marco = meses.Find("Março");
meses.AddBefore(marco, "Fevereiro");
meses.AddAfter(marco, "Abril");
var node = new LinkedListNode<string>("Maio");
// Adiciona o node
meses.AddLast(node);
foreach (string mes in meses)
{
Console.WriteLine(mes);
}
|
Se você precisa de uma estrutura de dados vinculada que permita adicionar e remover elementos com facilidade pode usar a classe genérica LinkedList<T>.
Para declarar uma lista vinculada, use o tipo genérico LinkedList<T>, em que T é o tipo de elemento.
Ao contrário dos outros tipos de coleção padrão, a lista vinculada não é apoiada por uma matriz. O tipo LinkedList <T> armazena valores em um tipo de wrapper chamado LinkedListNode<T>.
Cada nó na árvore fornece uma referência aos nós seguintes e anteriores, formando um link (portanto, lista vinculada) entre cada nó, em uma ordem linear. Essa estrutura torna essa lista bastante diferente para da List<T>.
Continuamos a abordar as demais estruturas de dados na próxima parte do artigo. ...
"Se alguém não
estiver em mim, será lançado fora, como a vara, e secará; e os colhem e lançam
no fogo, e ardem. Se vós estiverdes em mim, e as minhas palavras estiverem em
vós, pedireis tudo o que quiserdes, e vos será feito."
João 15:6,7
Referências: