Uma pilha é uma estrutura de dados linear simples que funciona como uma pilha de placas ?️. Segue o princípio Last In, First Out (LIFO). Pense nisso como uma pilha de pratos: você só pode adicionar ou remover pratos do topo da pilha.
Para uma melhor compreensão da pilha, vamos embarcar em uma curta jornada de imaginação?.
Imagine que você está em um restaurante chique ?️, e o pessoal da cozinha está se preparando para uma noite movimentada ??. Na área dos pratos, há uma pilha alta de pratos esperando para serem usados. À medida que os clientes chegam e os pedidos chegam, a equipe pega os pratos do topo da pilha. Quando placas limpas são adicionadas, elas vão direto para cima. Este sistema simples garante que as placas na parte inferior da pilha que estão lá há mais tempo sejam usadas por último, enquanto as placas recém-limpas no topo sejam usadas primeiro ✨.
É assim, em essência, como funciona uma estrutura de dados Stack. Uma pilha é uma estrutura de dados linear que segue o princípio Last In First Out (LIFO). Assim como acontece com nossa pilha de pratos, o último item adicionado a uma pilha é o primeiro a ser removido.
Neste tutorial abrangente sobre a estrutura de dados da pilha, exploraremos os seguintes tópicos com uma abordagem simples e amigável para iniciantes:
Você está pronto? Vamos mergulhar
Uma pilha é uma estrutura de dados linear que segue o princípio Last In, First Out (LIFO). Isso significa que o último elemento adicionado à pilha será o primeiro a ser removido. Pense nisso como uma pilha de livros: você só pode adicionar ou remover livros do topo da pilha.
Antes de continuarmos com o fluxo e escrevermos alguns códigos, é ótimo entender onde e onde não usar o Stack. A tabela abaixo fornece detalhes explícitos dos prós e contras do Stack.
Prós | Contras |
---|---|
Simples e fácil de implementar | Acesso limitado (apenas o elemento superior é diretamente acessível) |
Eficiente para operações Last In First Out (LIFO) | Não é adequado para acesso aleatório de elementos |
Tempo constante O(1) para operações push e pop | Pode levar ao estouro de pilha se não for gerenciado adequadamente |
Útil para rastrear o estado em algoritmos (por exemplo, pesquisa em profundidade) | Não é ideal para pesquisar ou acessar elementos arbitrários |
Ajuda no gerenciamento de memória (por exemplo, pilha de chamadas em linguagens de programação) | Tamanho fixo em algumas implementações (pilhas baseadas em array) |
Útil para reverter dados | Pode exigir redimensionamento em implementações dinâmicas, o que pode ser caro |
Suporta algoritmos recursivos naturalmente | Não é eficiente para grandes conjuntos de dados que exigem travessia frequente |
Ajuda na avaliação de expressões e análise de sintaxe | Potencial para underflow se a operação pop for chamada em uma pilha vazia |
Útil em mecanismos de desfazer em software | Funcionalidade limitada em comparação com estruturas de dados mais complexas |
Eficiente para certos tipos de organização de dados (por exemplo, histórico do navegador) | Não adequado para problemas que exigem comportamento tipo fila (FIFO) |
As operações fundamentais que podem ser realizadas em uma pilha são:
As pilhas estão por toda parte na ciência da computação e no desenvolvimento de software. Aqui estão algumas aplicações comuns:
Funcionalidade de desfazer: Em editores de texto ou software de design gráfico, cada ação é colocada em uma pilha. Quando você clica em "desfazer", a ação mais recente é retirada da pilha e revertida.
Histórico do navegador: quando você visita uma nova página, ela é colocada em uma pilha. O botão "voltar" retira a página atual da pilha, revelando a anterior.
Pilha de chamadas de função: Em linguagens de programação, as chamadas de função são gerenciadas usando uma pilha. Quando uma função é chamada, ela é colocada na pilha de chamadas. Quando ele retorna, ele se solta.
Avaliação de expressão: Pilhas são usadas para avaliar expressões aritméticas, especialmente aquelas em notação pós-fixada.
Algoritmos de retrocesso: Em problemas como resolução de labirintos ou quebra-cabeças, as pilhas podem acompanhar o caminho percorrido, permitindo fácil retrocesso quando necessário.
Agora, vamos implementar uma pilha em JavaScript. É importante saber que existem diferentes maneiras de implementar uma pilha em JavaScript. Uma das maneiras comuns de implementar uma pilha é usando array, outra maneira é usar lista vinculada. Neste artigo, implementaremos uma pilha usando lista vinculada (lista vinculada individualmente).
Espero que você ainda se lembre de como funciona a lista vinculada. Talvez seja necessário verificar a implementação da lista vinculada em um de nossos artigos anteriores desta mesma série.
Agora, vamos começar a implementar nossa pilha usando uma lista vinculada individualmente. Devemos nós?
Primeiro, criaremos uma classe Node para representar nosso item individual da pilha.
class Node { constructor(data) { this.data = data; this.next = null; } }
Em seguida, criaremos uma classe Stack para representar nossa pilha.
class Stack { constructor() { this.top = null; this.size = 0; } // Stack Operations will be implemented here ? }
A operação push adiciona um novo elemento ao topo da pilha. Ele cria um novo StackNode, define seu próximo ponteiro para o topo atual e, em seguida, atualiza top para apontar para esse novo nó. Finalmente, aumenta o tamanho.
// Push element to the top of the stack push(element) { const newNode = new Node(element); newNode.next = this.top; this.top = newNode; this.size ; }
A operação pop remove o elemento mais alto da pilha. Primeiro verifica se a pilha está vazia. Se for, ele retorna uma mensagem de erro. Caso contrário, remove o elemento superior, atualiza o ponteiro superior para o próximo nó e diminui o tamanho. Finalmente, ele retorna o elemento removido.
// Remove and return the top element pop() { if (this.isEmpty()) { return "Stack is empty"; } const poppedElement = this.top.data; this.top = this.top.next; this.size--; return poppedElement; }
A operação peek retorna o elemento superior sem removê-lo. Primeiro verifica se a pilha está vazia. Se for, ele retorna uma mensagem de erro. Caso contrário, ele retorna os dados do elemento superior.
// Return the top element without removing it peek() { if (this.isEmpty()) { return "Stack is empty"; } return this.top.data; }
A operação isEmpty verifica se a pilha está vazia. Ele retorna verdadeiro se a pilha estiver vazia e falso caso contrário.
// Check if the stack is empty isEmpty() { return this.size === 0; }
A operação getSize retorna o tamanho da pilha. Ele retorna o número de elementos na pilha.
// Return the size of the stack getSize() { return this.size; }
A operação de impressão imprime a pilha. Ele retorna os dados do elemento superior.
// Print the stack print() { let current = this.top; let result = ""; while (current) { result = current.data " "; current = current.next; } console.log(result.trim()); }
// Usage example const customStack = new CustomStack(); customStack.push(10); customStack.push(20); customStack.push(30); console.log(customStack.pop()); // 30 console.log(customStack.peek()); // 20 console.log(customStack.getSize()); // 2 console.log(customStack.isEmpty()); // false customStack.print(); // 20 10
Nesta implementação, usamos uma estrutura de lista vinculada (lista vinculada individualmente) para representar nossa pilha. Cada elemento é um Nó com um valor de dados e uma referência para o próximo Nó. O topo da pilha é sempre o nó adicionado mais recentemente.
As pilhas são uma estrutura de dados fundamental na ciência da computação que segue o princípio Last In, First Out (LIFO). Eles são usados em vários aplicativos, incluindo gerenciamento de chamadas de função, implementação de funcionalidade de desfazer e avaliação de expressões aritméticas.
Neste tutorial, cobrimos os fundamentos das pilhas, os prós e os contras de usá-las e sua implementação em JavaScript (usando lista vinculada). Compreender as pilhas não é apenas saber como implementá-las, mas também reconhecer quando elas são a ferramenta certa para resolver um problema.
Ao continuar sua jornada no desenvolvimento de software, você descobrirá que as pilhas são uma ferramenta indispensável em seu kit de ferramentas de solução de problemas. Eles são simples, mas poderosos, e dominá-los aumentará significativamente sua capacidade de projetar algoritmos e estruturas de dados eficientes.
Para garantir que você não perca nenhuma parte desta série e se conectar comigo para discussões mais aprofundadas sobre desenvolvimento de software (Web, servidor, móvel ou scraping/automação), estruturas de dados e algoritmos e outras tecnologias interessantes tópicos, siga-me em:
Fique ligado e boa programação ???
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3