Pilhas no Mundo da Programação: Conceitos e Aplicações

stack-pilhas

Fala galera da programação, tudo beleza?

As pilhas, ou stacks em inglês, são estruturas de dados fundamentais no mundo da programação. Elas desempenham um papel crucial em uma variedade de contextos, desde o gerenciamento de memória até a implementação de algoritmos complexos. Neste artigo, exploraremos os conceitos básicos das pilhas, suas operações fundamentais e suas diversas aplicações na ciência da computação.

 

O que são Pilhas?

Uma pilha é uma estrutura de dados linear que segue a abordagem de “último a entrar, primeiro a sair” (LIFO – Last In, First Out). Isso significa que o último elemento adicionado à pilha é o primeiro a ser removido. Imagine uma pilha de pratos em um buffet: os pratos são empilhados uns sobre os outros, e o último prato colocado sobre a pilha é o primeiro a ser retirado quando alguém deseja pegar um prato.

 

Operações em Pilhas

As pilhas suportam duas operações básicas:

  1. Push: Adiciona um elemento ao topo da pilha.
  2. Pop: Remove o elemento do topo da pilha.

Além dessas operações, é comum também termos a operação Peek ou Top, que permite visualizar o elemento no topo da pilha sem removê-lo.

 

Implementação de Pilhas

As pilhas podem ser implementadas de várias maneiras, sendo as mais comuns usando arrays ou listas ligadas. A implementação com arrays geralmente é mais eficiente em termos de acesso direto aos elementos, enquanto a implementação com listas ligadas oferece maior flexibilidade em termos de tamanho dinâmico da pilha. Aqui está um exemplo de implementação de pilha usando arrays em Python:

class Pilha:
    def __init__(self):
        self.items = []

    def is_empty(self):
        return self.items == []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        if not self.is_empty():
            return self.items.pop()
        else:
            raise IndexError("A pilha está vazia")

    def peek(self):
        if not self.is_empty():
            return self.items[-1]
        else:
            raise IndexError("A pilha está vazia")

    def size(self):
        return len(self.items)

 

Aplicações das Pilhas

As pilhas são amplamente utilizadas em uma variedade de aplicações na ciência da computação, incluindo:

Gerenciamento de Memória

As pilhas são usadas para gerenciar a alocação e liberação de memória em muitos sistemas de computação. Por exemplo, em linguagens de programação como C e C++, as variáveis locais e os registros de ativação de função são frequentemente armazenados em uma pilha de execução.

 

Expressões Matemáticas

As pilhas são essenciais na avaliação de expressões matemáticas infixas, como (3 + 4) * 5. Elas são usadas para converter essas expressões em notação pós-fixa (ou polonesa reversa) para facilitar a avaliação. Por exemplo:

  • Expressão Infixa: (3 + 4) * 5
  • Expressão Pós-fixa: 3 4 + 5 *

Aqui está um exemplo de como uma pilha pode ser usada para avaliar uma expressão matemática pós-fixa (polonesa reversa) em Python:

def avaliar_expressao(expressao):
    pilha = Pilha()
    for token in expressao.split():
        if token.isdigit():
            pilha.push(int(token))
        else:
            operando2 = pilha.pop()
            operando1 = pilha.pop()
            resultado = None
            if token == '+':
                resultado = operando1 + operando2
            elif token == '-':
                resultado = operando1 - operando2
            elif token == '*':
                resultado = operando1 * operando2
            elif token == '/':
                resultado = operando1 / operando2
            pilha.push(resultado)
    return pilha.pop()

expressao = "3 4 + 5 *"
print("Resultado da expressão:", avaliar_expressao(expressao))

 

Navegação em Profundidade (DFS)

Em algoritmos de busca em grafos, como a busca em profundidade (DFS), as pilhas são usadas para armazenar nós a serem visitados e garantir que a busca explore tão profundamente quanto possível antes de retroceder. Aqui está um exemplo de como uma pilha pode ser usada para implementar a busca em profundidade (DFS) em um grafo em Python:

def dfs(grafo, vertice_inicial):
    visitados = set()
    pilha = Pilha()
    pilha.push(vertice_inicial)
    while not pilha.is_empty():
        vertice = pilha.pop()
        if vertice not in visitados:
            visitados.add(vertice)
            print("Visitando vértice:", vertice)
            for vizinho in grafo[vertice]:
                pilha.push(vizinho)

grafo = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}

dfs(grafo, 'A')

 

Undo/Redo Funcionalidade

Muitos aplicativos, como editores de texto e software de design gráfico, implementam funcionalidades de “Desfazer” e “Refazer” usando pilhas. Cada ação do usuário é armazenada em uma pilha, permitindo que eles revertam ou reapliquem alterações conforme necessário.

 

Chamadas de Função

As pilhas são utilizadas para gerenciar a execução de funções em muitas linguagens de programação. Cada vez que uma função é chamada, um registro de ativação de função é empilhado, contendo informações como parâmetros, variáveis locais e o endereço de retorno.

 

Conclusão

As pilhas são uma estrutura de dados fundamental no mundo da programação, oferecendo uma maneira eficiente de armazenar e gerenciar dados. Sua simplicidade e versatilidade as tornam essenciais em uma ampla gama de aplicações, desde o gerenciamento de memória até algoritmos de busca e operações de desfazer/refazer. Compreender os conceitos básicos das pilhas é fundamental para qualquer programador que deseje desenvolver soluções eficientes e robustas em suas aplicações.

 

 

Beleza pessoal? Espero que possa ajudar.

 

Dúvidas ou sugestões? Deixe o seu comentário!

 

Um abraço e até o próximo post. Valeu!

 

#Pilhas

#EstruturasDeDados

#Programação

#GiovaniDaCruz

  • Publicado por Giovani Da Cruz
  • 4 views
  • 0 comentarios
  • 12 de abril de 2024

 

Está gostando do conteúdo?
Considere pagar um cafezinho para nossa equipe!

 

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Posts Relacionados a Categoria Programação

Continue aprendendo

Aumente o seu conhecimento
Explorando os Operadores Matemáticos nas Linguagens de Programação
7 de maio de 2024
Utilizando TParallel.For da Biblioteca de Programação Paralela em Delphi
6 de maio de 2024
A Importância de Nomes Mnemônicos em Variáveis: Facilitando a Compreensão e Manutenção do Código
2 de maio de 2024
Detecção de formatos gráficos em Delphi
19 de abril de 2024
Imagens e Fotos em Delphi e Lazarus (TImage e TDBImage)
4 de abril de 2024
Título: Entendendo Variáveis Não Nulas e Não Descartáveis em C#
3 de abril de 2024
Merge Sort: O Método Eficaz de Ordenação
2 de abril de 2024
Como Realmente Funcionam as Strings: Uma Profunda Análise
25 de março de 2024
Explorando Hashmaps: Uma Visão Completa
14 de março de 2024
3 Maneiras de Evitar o “for” em JavaScript com Métodos de Array e Programação Funcional
10 de março de 2024