Sem resumo de edição |
Sem resumo de edição |
||
| Linha 81: | Linha 81: | ||
Figura 1 | Figura 1 – Fila | ||
Edição das 00h39min de 12 de dezembro de 2025
Dados, existente em vários tipos, são blocos básicos da programação. Eles representam alguma unidade informação que pode ser acessado através de um identificador – comumente, uma variável.
A maioria das linguagens de programação trabalha com as variações baseadas nos quatro tipos primitivos de dados, sendo elas:
INT: valores numéricos inteiros (positivos e negativos);
FLOAT: valores numéricos decimais/com números após a vírgula (positivos e negativos);
BOOLEAN ou booleanos: representado apenas por dois valores, “verdadeiro” e “falso”. Também chamados de operadores lógicos;
TEXT: sequências ou cadeias de caracteres, utilizados para manipular textos e/ou outros tipos de dados não numéricos ou booleanos, como hashes de criptografia.
E para a organização do armazenamento e manipulação desses dados, utilizamos a estruturas de dados.
ESTRUTURA DE DADOS, O QUE SÃO?
Estrutura de dados, conceito da ciência da computação, essencial para profissionais que atuam com dados como desenvolvedores de software, cientistas de dados, dentre outros profissionais. Representa o modo otimizado, mais organizado e eficaz de armazenar e manipular dados, auxiliando no processamento de dados, permitindo a operação de algoritmos sobre eles de forma adequada e eficiente. A estrutura de dados tem várias vertentes para que essa manipulação de dados ocorra de forma eficiente.
Cada estrutura de dados tem um conjunto de métodos próprios para realizar operações como:
Inserir ou excluir elementos;
Buscar e localizar elementos;
Ordenar (classificar) elementos de acordo com alguma ordem especificada.
Dentre estas vertentes temos os arrays ou "arranjos".
Array, podendo também ser chamado de outros nomes, como: arranjo e mais especificamente, vetor (estruturas unidimensionais) e matriz (estruturas multidimensionais), nada mais é que um "espaço" divido em um determinado tamanho e possível de armazenar informações de um mesmo tipo (algumas poucas linguagens permitem armazenamento de dados de tipos diferentes no mesmo, sendo assim minoria de toda forma). trazendo mais um pouquinho para a programação, podemos citar exemplos práticos, como armazenar os valores dos salários de funcionários de uma empresa. Então criaríamos um array, tendo seu tipo como float, já que poderíamos ter valores decimais representando determinados valores de salário, criaríamos também, uma variável do tipo inteiro para ser o "índice do vetor" (variável que usaríamos para percorrer o vetor para ler, guardar informações e realizar qualquer tipo de manipulação nele).
Lista
As listas armazenam os elementos de forma sequencial, diferente de como ocorre nos arrays, as suas informações podem estar em qualquer lugar da memória , já que os seus endereços estão interligados. As listas usam ponteiros para interligar os elementos mostrando o próximo endereço, sem que seja necessário que eles estejam no próximo bloco de memória.
Usando as listas não é necessário deslocar os elementos sempre que incluir ou excluir algo, como seria no array, basta mudar o endereço, visto que cada nó da lista direciona para o ponteiro da memória onde está o próximo elemento.
Tipos de Listas
Lista encadeada simples: É uma lista que contém somente um endereço por nó apontando para o próximo da lista.
Lista duplamente encadeada: São listas que cada nó possui dois ponteiros, em que um aponta para o próximo nó e o outro para o anterior.
Lista encadeadas circulares: Nessa lista o último nó aponta para o primeiro, esse tipo de lista pode ser simples ou dupla.
Se uma lista é ordenada, a ordem linear da lista corresponde à organização linear dos elementos da lista, podendo ser crescente ou decrescente. Se a lista não for ordenada, os elementos podem aparecer em qualquer ordem.
Vantagens:
• Facilidade em inserir ou retirar algo no meio da lista
• Flexibilidade em criar listas de tamanhos indefinidos
Desvantagens:
• Dificuldade em acessar os últimos itens, porque só conseguimos saber o endereço do elemento seguinte
• Muitas linguagens não possuem listas prontas, o programador precisa criá-las manualmente.
- Estrutura de Dados - Fila
A fila é um tipo especial de lista, onde os elementos são inseridos em uma extremidade, chamada início da fila, e retirados na extremidade oposta, chamada final da fila (figura 1). Esta característica é conhecida como FIFO (First In, First Out - Primeiro a Entrar, Primeiro a Sair). Desta forma, o primeiro elemento que foi inserido na fila será o primeiro elemento a ser removido. A estrutura fila pode ser comparada a uma fila de banco. O primeiro cliente que chegou, será o primeiro a ser atendido. Também a fila pode ser implementadas de forma estática, é uma estrutura de dados implementada sobre um vetor de tamanho fixo, definido previamente pelo programador, ou dinâmica, é construída sobre uma lista encadeada, o que significa que sua capacidade pode crescer de acordo com a necessidade do programa, restringida apenas pela memória disponível.
Figura 1 – Fila
A estrutura de dados fila, como seu próprio nome já sugere, é semelhante ao funcionamento de uma fila de banco. Onde: 1) Se não há ninguém na fila e chega uma pessoa, está será o inicio e o fim da fila; 2) A partir de então, qualquer pessoa que chegar irá para o final da fila (após a pessoa que está no fim); 3) Cada elemento a ser removido será do inicio da fila (O primeiro que chega na fila é o primeiro que sai).
As operações mais comuns efetuadas com filas são:
• Criar: cria uma fila vazia.
• Enfileirar: insere um elemento no fim da fila.
• Desenfileirar: remover um elemento no início da fila.
• Exibir início: exibe o elemento do início da fila.
• Exibir a quantidade: retorna a quantidade de elementos da fila.
• Esvaziar: esvazia a fila.
As filas são úteis em diversas aplicações, como por exemplo, os sistemas operacionais, que utilizam filas para gerenciar o escalonamento dos processos que serão executados pelo processador e a alocação de recursos.
Uma fila possui elementos característicos, sem os quais torna-se impossível sua manipulação:
- Frente: é a posição que indica o próximo elemento a ser acessado. - Fim: é a posição que indica o próximo elemento a ser inserido. - Tamanho: é o número máximo de posições permitidas na fila.
Tamanho = 7 Frente = 1 Fim = 4
Operações:
Temos as operações de inicialização de uma fila, inserção de um elemento e retirada de um elemento.
- Inicialização: dizemos que uma fila F está vazia, quando sua frente e seu fim for igual a zero, ou seja, não existe nenhuma posição da estrutura ocupada por algum elemento.
- Inserção: podemos inserir elementos até que o fim seja igual ao tamanho. Inserção de elementos além do tamanho da fila, configura-se um caso de overflow,ocorre quando uma operação excede a capacidade de armazenamento de um tipo de dado, resultando em erros inesperados.
-Remoção: podemos retirar elementos da fila, até que frente seja igual ao fim. Retirada de elementos além desta situação, configura-se um caso de undeflow, se refere a uma condição em que um valor é reduzido abaixo do limite mínimo que pode ser representado por um tipo de dado,levando a comportamentos inesperados no programa.
Outras variações de fila:
Fila Circular: Uma variação da fila simples, mas que reaproveita o espaço do array quando o fim é alcançado, “voltando” para o início. Isso evita o problema de “fila cheia falsa” e permite melhor utilização da memória. É muito usada em sistemas embarcados, buffers de comunicação e estruturas que precisam de alto desempenho contínuo.
Fila Dupla (Deque – Double Ended Queue):
É uma fila onde tanto o início quanto o fim podem receber inserções e remoções. Isso permite funções de fila e de pilha ao mesmo tempo. Usada em algoritmos de busca, navegadores (voltar/avançar), buffers deslizantes e estruturas mais flexíveis de dados.
Pilha (Stack)
A Pilha(Stack) é uma estrutura de dados do tipo LIFO (Last in, First out), ou seja, o último elemento a entrar é o primeiro a sair. Podemos pensar em uma pilha de pratos, o último a ser colocado no topo da pilha é o primeiro a ser pego, é isso que acontece com os elementos da pilha.
Há duas maneiras de implementar a pilha:
•Locação estatística: as informações são colocadas em um vetor (array) de tamanho fixo e limitado. Esse tipo de locação é rápido e fácil de implementar.
•Locação dinâmica: é feito com uma lista encadeada, enquanto houver memória disponível na máquina, os elementos continuarão sendo empilhados. Esse tipo de locação é um pouco mais complexo.
As principais operações da Pilha são:
•Push: empilhar um elemento
•Pop: desempilha e retorna o elemento para o usuário
•Top (peek): informa o elemento que está no topo mas sem desempilhar
•Is Empty: informa se a pilha está vazia ou não retornando um booleano
•Is Full: informa se a pilha está cheia, também retorna um booleano
•Size: retorna quantos elementos foram armazenados
Em que caso a pilha é usada?
•Navegadores Web - Histórico de páginas (o último app acessado é o primeiro para o qual você vai voltar)
•A opção de desfazer e refazer (em editores de texto, Photoshop, etc)
•Recursão (o computador cria uma pilha de chamada para as funções)
Vantagens:
•Fácil de usar e simples de implementar
•Perfeito para quando a ordem dos elementos importa
•Bom para memória automática
Desvantagens:
•Normalmente são estruturas pequenas, usadas para armazenar poucos dados.
•Só é possível mexer no topo da pilha, as informações que estão no meio ou no fundo não podem ser acessadas.
•Se for implementada com vetor pode ocorrer um Overflow.
•Se for implementada com Lista, por causa do uso dos ponteiros, é propenso a dar erros.
Estrutura de dados: árvore
Derivada das árvores genealógicas, essa estrutura abstrata usa hierarquia para organizar dados na computação. Elas possibilitam a implementação de algoritmos de forma não linear e natural. Suas aplicações são variadas, tais quais:
• Sistemas de arquivos (grande ênfase para distribuições Linux); • Bancos de dados
Definição formal: Formalmente, define-se uma árvore T como um conjunto de nodos que armazenam elementos em relacionamento pai-filho com as seguintes propriedades:
• Se T não é vazia, ela tem um nodo especial chamado raiz de T, que não tem pai. • Cada v de T diferente da raiz tem um único pai, w: todo nodo com pai w é filho de w.
Conceitos e relacionamento entre os elementos:
• Cada elemento é chamado de nodo; • Nodos do mesmo pai são chamado de irmãos; • Um nodo é chamado de interno se ele possui filho, mas de externo - ou folha - se não possui filhos; • A partir de um nodo u em uma árvore T, podemos ter uma subárvore de T enraizada em u.
Aresta e caminhos:
• Uma aresta consiste em dois novos u,v, tais que um deles é pai e o outro filho; • Um caminho é uma sequência de nodos, tais que, dois a dois, formam arestas.
Ordenação:
• Uma árvore é tomada por ordenada se existe uma ordem linear identificável para os filhos de seus nodos.
Imagem retirada de: Estruturas de dados & algoritmos em Java, MT Goodrich, R Tamassia - 2013.
Pergunta:
1- Qual é a regra básica de funcionamento de uma fila e como ela determina quem é atendido primeiro?
2- Em um aplicativo para anotar os pedidos dos clientes em um restaurante, os garçons adicionam novos pedidos ao final da fila e os cozinheiros retiram os pedidos do início da fila. Nesse aplicativo é usado um array ou uma lista?
3- Em que caso a operação Is Full pode ser usada, quando a implantação é feita com vetores ou lista encadeada?
4- Por que pilhas são usadas em chamadas recursivas?
5- A estrutura de dados do tipo árvore deriva de onde? Qual sua principal característica?
Referências:
BEZERRA, Cícero Aparecido. Introdução às estruturas de dados. Curitiba: UFPR, 2018. Disponível em: https://acervodigital.ufpr.br/xmlui/bitstream/handle/1884/55879/introducaoEstruturaDados.pdf?sequence=1&isAllowed=y. Acesso em: 07 dez. 2025.
BALIEIRO, Ricardo. Estrutura de dados. 1. ed. Rio de Janeiro: SESES, 2015. 176 p. Disponível em: https://hood.com.br/new/filegator/repository/Estrutura%20de%20Dados/10%20Livro%20Estrutura%20de%20Dados.pdf. Acesso em: 07 dez. 2025
CORTÉS, Mariela Inés. Estrutura de Dados. 3. ed. Fortaleza, CE: EdUECE, 2015. Disponível em: https://www.uece.br/cct/wp-content/uploads/sites/28/2021/07/Estrutura-de-Dados-2014.pdf. Acesso em: 07 dez. 2025.
UNIOESTE. Aulas Estruturas de Dados. Cascavel: Universidade Estadual do Oeste do Paraná, 2019. Disponível em: https://www.inf.unioeste.br/~adair/ED/Notas%20de%20Aula/Aulas%20Estruturas%20de%20Dados.pdf. Acesso em: 07 dez. 2025.
LUCCHESI, Cláudio L.; KOWALTOWSKI, Tomasz. Estruturas de Dados e Técnicas de Programação. Versão 1.12. Campinas: Instituto de Computação – UNICAMP, 2004. Disponível em: https://www.ic.unicamp.br/~mc202abcd/ln_tkcll.pdf. Acesso em: 07 dez. 2025.
BHARGAVA, A. Y. Entendendo Algoritmos: um guia ilustrado para programadores e outros curiosos. Novatec, 2017.
CORMEN, Thomas H. et al. Algoritmos: teoria e prática. 3. ed. Rio de Janeiro: GENLTC, 2012.
SIQUEIRA, Fernando De. 14-Listas. ALGORITMOS E ESTRUTURAS DE DADOS AVANÇADOS. Disponível em:https://sites.google.com/site/proffdesiqqueiraalgeedavanc/aulas/14-listas
SONG, Siang Wun. Listas Lineares. São Paulo: IME/USP, 2008. Disponível em: https://www.ime.usp.br/~song/mac5710/slides/02linear.pdf
Piech, Chris. Arrays. CS106A, Stanford University. Disponível em: chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://web.stanford.edu/class/archive/cs/cs106a/cs106a.1184/lectures/15-Arrays/15-Arrays.pdf
Lintzmayer, Carla Negri. Análise de Algoritmos e de Estruturas de Dados.
Bezerra, Cicero Aparecido. Introdução às estruturas de dados.
https://www.alura.com.br/artigos/estruturas-de-dados-introducao
chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://catalogcdns3.ulife.com.br/content-cli/CTI_ESTDAD_19/unidade_3/ebook/EstruturasDados.pdf
UNIVERSIDADE FEDERAL DO PARANÁ. Pilhas e Filas – CI1001. Disponível em: https://www.inf.ufpr.br/gregio/CI1001/PilhaFila.pdf. Acesso em: 10 dez. 2025.
UNIVERSIDADE FEDERAL DE MINAS GERAIS. Estruturas de Dados – Pilha. YouTube, 2020. Disponível em: https://youtu.be/2V91Re1czwA?si=lwVXakxxIXyAv2MT. Acesso em: 9 dez. 2025
PROF. GIORDANO CARMINATI. Pilhas e Filas – Estruturas de Dados. YouTube, 2021. Disponível em: https://youtu.be/tR_Fl4v7FM0?si=F0p9KQOr6xemuuse. Acesso em: 9 dez. 2025.
@book{goodrich2013estruturas,
title={Estruturas de dados \& algoritmos em Java},
author={Goodrich, Michael T and Tamassia, Roberto},
year={2013},
publisher={Bookman Editora}
}





