“Pilha” em Java: explicação e aplicação

A pilha é uma estrutura de dados importante na programação que funciona de acordo com o princípio LIFO (Last-In-First-Out). Em Java, a pilha geralmente está na forma da classe java.util.Stack usado. Esta classe é uma implementação do tipo de dados Stack e fornece métodos como push para adicionar elementos, pop para remover o elemento superior e peek para obter o elemento superior sem removê-lo. A pilha pode ser usada para armazenar e recuperar elementos em uma ordem específica.

Resumo:

  • A pilha é uma estrutura de dados que funciona de acordo com o princípio LIFO.
  • Em Java, a pilha é frequentemente usada com o java.util.Stackclasse implementada.
  • O java.util.Stackclasse fornece métodos como push , pop e peek .
  • O uso do java.util.Stackclass não é mais recomendada por desenvolvedores Java.
  • Implementações alternativas como ArrayDeque deve ser usado.

Como funciona a pilha Java

A pilha Java usa o princípio LIFO, no qual o último elemento adicionado é removido primeiro. Este é o método push usado para colocar um elemento no topo da pilha. Com o método pop O elemento superior é retirado e removido da pilha ao mesmo tempo. O peek O método permite acesso ao elemento superior sem removê-lo.

Um exemplo de uso da pilha Java seria adicionar os elementos “maçã”, “laranja” e “pêra”. push e removendo os elementos pop na ordem inversa:

// Java Stack Beispiel
import java.util.Stack;
Stack stack = new Stack  ;
stack.push("apple");
stack.push("orange");
stack.push("pear");
System.out.println(stack.pop );    // Output: pear
System.out.println(stack.pop );    // Output: orange
System.out.println(stack.pop );    // Output: apple

Com o push método, “maçã”, “laranja” e “pêra” são colocadas na pilha nessa ordem. Através do pop método, os elementos são obtidos na ordem inversa, começando com o último elemento adicionado “pêra”.

Exemplo de pilha Java:

operação Estado da pilha
stack.push("apple") (“maçã”)
stack.push("orange") (“maçã”, “laranja”)
stack.push("pear") (“maçã”, “laranja”, “pêra”)
stack.pop (“maçã”, “laranja”)
stack.pop (“maçã”)
stack.pop

Métodos e propriedades da pilha Java

A aula java.util.Stack em Java oferece além dos métodos básicos de pilha como push , pop e peek outros métodos e propriedades. No entanto, o uso da classe Stack não é mais recomendado pelos desenvolvedores Java, pois existem implementações mais poderosas.

Os métodos e propriedades da pilha Java incluem:

  • push : Adiciona um elemento ao topo da pilha.
  • pop : Abre e remove o elemento superior da pilha.
  • peek : Retorna o elemento superior da pilha sem removê-lo.
  • empty : verifica se a pilha está vazia.
  • search : procura um elemento na pilha e retorna sua distância até o topo da pilha.

A pilha Java também herda métodos da classe java.util.Vector e é thread-safe porque todos os métodos são sincronizados.


API de pilha Java

Uma visão geral dos métodos da pilha Java:

método Descrição
push Adiciona um elemento ao topo da pilha.
pop Abre e remove o elemento superior da pilha.
peek Retorna o elemento superior da pilha sem removê-lo.
empty Verifica se a pilha está vazia.
search Procura um elemento na pilha e retorna sua distância até o topo da pilha.

Usando Deque como alternativa ao Stack

Os desenvolvedores Java recomendam usar o java.util.Dequeinterface e suas implementações como uma alternativa ao java.util.Stack-Aula. Uma das implementações recomendadas é ArrayDequeque possuem métodos semelhantes aos push , pop e peek ofertas. Em vez de empty torna-se o método isEmpty usado. O search O método não existe no Deque.

Um exemplo do uso de ArrayDeque como uma pilha seria semelhante ao exemplo anterior usando push , pop e peek .


Exemplo de pilha Java

É importante escolher a implementação da pilha com base nas necessidades específicas da aplicação. No exemplo a seguir, a tabela contém uma comparação das funções e propriedades do java.util.Stack-classe e o ArrayDeque-Implementação.

java.util.Stack ArrayDeque
Extensão de java.util.Vector Não
método isEmpty Sim
método search Não
Métodos sincronizados Não

Razões contra o uso do Java Stack

Embora a classe `java.util.Stack` seja amplamente utilizada em Java, existem alguns motivos pelos quais seu uso não é recomendado. Aqui estão alguns pontos contra o uso da pilha Java:

1. Extensão de `java.util.Vector`

O Java Stack é uma extensão da classe `java.util.Vector` que fornece métodos e funções não relevantes para uma pilha. Acessar elementos por meio de seu índice ou inserir e excluir elementos em posições arbitrárias não são necessários em uma pilha. Expandir `java.util.Vector` introduz sobrecarga desnecessária e pode resultar em desempenho ineficiente.

2. Falta de implementação de uma interface

A classe `java.util.Stack` não implementa uma interface e, portanto, está bloqueada para uma implementação específica. Isto pode levar a incompatibilidades e limitações quando o código se destina a ser utilizado com outras partes do sistema ou com implementações alternativas. O uso de classes que implementam uma interface fornece mais flexibilidade e permite que as implementações sejam facilmente trocadas sem reescrever o código.

3. Métodos sincronizados e segurança de thread

Todos os métodos da classe `java.util.Stack` são sincronizados para garantir a segurança do thread. Isso significa que cada chamada de método na pilha incorre na sobrecarga de sincronização, mesmo que em muitos casos isso não seja necessário. Os métodos sincronizados podem resultar na degradação do desempenho e não são a maneira mais eficiente de garantir a segurança do thread. Para a maioria dos aplicativos, usar uma implementação não sincronizada é suficiente.

4. Alternativa recomendada: `ArrayDeque`

Para evitar os problemas mencionados, o uso de `ArrayDeque` é recomendado como alternativa à classe `java.util.Stack`. `ArrayDeque` oferece métodos e propriedades semelhantes à pilha Java, mas é mais eficiente e flexível. Ele implementa a interface `Deque`, que fornece funcionalidade estendida e permite que a pilha seja customizada conforme necessário.

Para uma comparação detalhada da classe `java.util.Stack` e do `ArrayDeque` como alternativa, consulte a tabela a seguir:

`java.util.Stack` `ArrayDeque`
Extensão de `java.util.Vector` Indisponível
Métodos sincronizados Não sincronizado
Não implementa nenhuma interface Implementa a interface `Deque`

Usar `ArrayDeque` oferece uma alternativa mais eficiente e flexível à pilha Java. Ele permite a personalização de acordo com requisitos específicos e oferece melhor desempenho.


API de pilha Java

Pelos motivos mencionados e pela alternativa recomendada, é aconselhável evitar a classe `java.util.Stack` e usar `ArrayDeque` ou outras implementações de `Deque`.

Estrutura de dados da pilha e suas aplicações

A estrutura de dados de pilha é amplamente utilizada em programação para armazenar e recuperar elementos em uma ordem específica. Baseia-se no princípio LIFO (Last-In-First-Out), em que o último elemento adicionado é o primeiro a ser removido. Em Java, a pilha é incluída como parte da biblioteca padrão com a classe java.util.Stack implementado.

Uma aplicação importante da estrutura de dados da pilha é a organização de chamadas de subprogramas. Os endereços de retorno dos subprogramas são armazenados na pilha. Quando um subprograma é concluído, o endereço é retirado do topo da pilha para retornar ao programa de chamada. Este processo é gerenciado automaticamente durante a execução do programa e permite o correto manejo dos subprogramas.

Outro cenário de aplicação para a pilha é o monitoramento de chamadas de métodos. Por exemplo, a pilha pode ser usada para rastrear a ordem das chamadas de método em um fluxo de programa. Isso permite que a lógica do processo seja analisada e possíveis erros ou gargalos sejam identificados.

Além disso, a pilha pode ser usada para rastrear ramificações em um programa. Certos padrões de programação exigem o armazenamento de informações de ramificação para garantir o fluxo adequado do programa. A pilha fornece uma maneira eficiente de gerenciar o estado das filiais e acessá-las quando necessário.

Outras aplicações da estrutura de dados da pilha:

  • Desfazer funções em editores de texto ou programas gráficos
  • Algoritmos de retrocesso em programação algorítmica
  • Avaliação de expressões aritméticas na construção de compiladores
  • Implementação de recursos de histórico do navegador da web

A estrutura de dados da pilha é um conceito fundamental em programação e é usada não apenas em Java, mas também em muitas outras linguagens de programação. Ele fornece uma maneira simples e eficiente de gerenciar e acessar itens em uma ordem específica.


Estrutura de dados de pilha

Implementação personalizada de uma classe de pilha em Java

Além de usar o pré-definido java.util.Stackclasse, também é possível implementar sua própria classe de pilha em Java. Isto oferece a oportunidade de adaptar a funcionalidade da pilha a requisitos específicos e criar uma implementação personalizada.

Existem várias maneiras de implementar uma classe de pilha personalizada em Java. Um método comum é usar arrays, listas vinculadas ou outras estruturas de dados para armazenar a pilha.

Uma implementação de array usa um array para armazenar os elementos da pilha. A vantagem desta implementação é a indexação eficiente dos elementos. Os métodos push , pop e peek pode ser semelhante a java.util.Stackclasse pode ser implementada.

Um exemplo de implementação personalizada:

“`java
classe pública CustomStack {
private int stackArray;
privado int superior;

public CustomStack(int capacidade) {
stackArray = new int(capacidade);
topo = -1;
}

public void push(int elemento) {
if (topo == stackArray.length – 1) {
System.out.println(“Pilha cheia”);
} outro {
stackArray(++topo) = elemento;
}
}

público int pop {
if (topo == -1) {
System.out.println(“A pilha está vazia”);
retornar -1;
} outro {
return stackArray(topo–);
}
}

public int espiar {
if (topo == -1) {
System.out.println(“A pilha está vazia”);
retornar -1;
} outro {
return stackArray(topo);
}
}

public boolean isEmpty {
retornar topo == -1;
}

pesquisa int pública (elemento int) {
for (int i = topo; i >= 0; i–) {
if (stackArray(i) == elemento) {
retornar para cima – i + 1;
}
}
retornar -1;
}
}
“`

Este exemplo cria uma classe Stack personalizada que usa uma matriz. O tamanho do array é definido como parâmetro no construtor. Os métodos push , pop , peek , isEmpty e search são semelhantes aos métodos de java.util.Stackclasse implementada.

A implementação personalizada permite que os desenvolvedores personalizem a pilha de acordo com suas necessidades específicas e criem a funcionalidade desejada.

Resumo e recomendações

A pilha é uma estrutura de dados importante na programação que funciona de acordo com o princípio LIFO. Em Java, o java.util.Stackclasse usada para realizar operações de pilha. No entanto, existem implementações alternativas como esta ArrayDequeque são recomendados.

O java.util.Stackclasse tem algumas desvantagens. Ele expande o java.util.Vectorclasse e fornece recursos que não são relevantes para pilhas. Os métodos sincronizados para garantir a segurança do thread introduzem sobrecarga. Portanto, recomenda-se o uso de implementações alternativas.

Uma implementação customizada de uma pilha em Java permite customização e otimização de funcionalidade. Ao implementar seus próprios métodos como push , pop , peek , empty e search A pilha pode ser personalizada de acordo com requisitos específicos.

Ao usar a pilha, é importante considerar os requisitos e capacidades específicos. Escolher a implementação correta e otimizá-la pode melhorar a eficiência da pilha e levar a um melhor desempenho do aplicativo.

Perguntas frequentes

O que é uma pilha e como ela é usada em Java?

Uma pilha é uma estrutura de dados em programação que funciona de acordo com o princípio LIFO (Last-In-First-Out). Em Java, a pilha é frequentemente usada na forma da classe `java.util.Stack`. Esta classe é uma implementação do tipo de dados stack e fornece métodos como `push ` para adicionar elementos, `pop ` para exibir o elemento superior e `peek ` para obter o elemento superior sem removê-lo. A pilha pode ser usada para armazenar e recuperar elementos em uma ordem específica.

Como funciona a pilha Java?

A pilha Java usa o princípio LIFO, no qual o último elemento adicionado é removido primeiro. Quando um elemento é adicionado, ele é colocado no topo da pilha usando o método `push `. O método `pop ` abre o elemento superior e o remove da pilha ao mesmo tempo. O método `peek ` permite acesso ao elemento superior sem removê-lo. Um exemplo de uso da pilha Java seria adicionar elementos como “apple”, “orange” e “pear” com `push ` e estourar os elementos com `pop ` na ordem inversa.

Quais métodos e propriedades a classe Stack possui em Java?

A classe `java.util.Stack` em Java fornece outros métodos e propriedades além dos métodos básicos de pilha, como `push `, `pop ` e `peek `. O método `empty ` verifica se a pilha está vazia. O método `search ` procura um elemento específico na pilha e retorna sua distância até o topo da pilha. A pilha Java também herda métodos da classe `java.util.Vector` e é thread-safe, pois todos os métodos são sincronizados. No entanto, o uso da classe Stack não é mais recomendado pelos desenvolvedores Java, pois existem implementações mais poderosas.

Existe uma alternativa para usar a classe `java.util.Stack` em Java?

Os desenvolvedores Java recomendam usar a interface `java.util.Deque` e suas implementações como uma alternativa à classe `java.util.Stack`. Uma das implementações recomendadas é `ArrayDeque`, que fornece métodos semelhantes a `push `, `pop ` e `peek `. Em vez de `empty ` o método `isEmpty ` é usado. O método `search ` não existe no Deque. Um exemplo de uso de `ArrayDeque` como pilha seria semelhante ao exemplo anterior com `push `, `pop ` e `peek `.

Por que usar a classe `java.util.Stack` não é recomendado em Java?

Não é recomendado usar a classe `java.util.Stack` pois tem algumas desvantagens. A extensão `java.util.Vector` fornece funcionalidades que não são relevantes em uma pilha, como acessar elementos através de seu índice ou inserir e excluir elementos em posições arbitrárias. A pilha não implementa uma interface e, portanto, está fixada em uma implementação específica. A sincronização de todos os métodos introduz sobrecarga e não é a maneira mais eficiente de garantir a segurança do thread. Portanto, é recomendado usar `ArrayDeque` ou outras implementações de `Deque`.

Para que é usada a estrutura de dados da pilha?

A estrutura de dados da pilha é usada na programação para armazenar e recuperar elementos em uma ordem específica. É utilizado, entre outras coisas, na organização de chamadas de subprogramas, nas quais os endereços de retorno dos subprogramas são armazenados na pilha. A estrutura de dados da pilha é importante para a programação e é até implementada em hardware na maioria dos processadores. Além de seu uso como pilha de chamadas, há também outros usos para a estrutura de dados da pilha, como monitorar chamadas de métodos ou rastrear ramificações em um fluxo de programa.

Você pode implementar uma classe de pilha personalizada em Java?

Sim, além de usar a classe predefinida `java.util.Stack`, também é possível implementar sua própria classe de pilha em Java. Isso pode ser feito com arrays, listas vinculadas ou outras estruturas de dados. Uma implementação personalizada permite que a funcionalidade da pilha seja adaptada a requisitos específicos. Métodos como `push `, `pop `, `peek `, `empty ` e `search ` podem ser implementados, semelhantes aos métodos da classe `java.util.Stack` . Um exemplo de implementação personalizada poderia ser uma classe Stack que usa uma matriz e é adaptada ao caso de uso específico.

Quais são as recomendações e resumo para usar Stack em Java?

A pilha é uma estrutura de dados importante na programação que funciona de acordo com o princípio LIFO. Em Java, a classe `java.util.Stack` é comumente usada, mas implementações alternativas como `ArrayDeque` são recomendadas. A classe `java.util.Stack` tem algumas desvantagens, como estender `java.util.Vector` com funções que não são relevantes em uma pilha e os métodos sincronizados para garantir a segurança do thread. Uma implementação personalizada pode personalizar e otimizar a funcionalidade. Ao usar a pilha, é importante considerar os requisitos e possibilidades específicas.

Referências de origem

Programação

Related Content

Back to blog

Leave a comment

Please note, comments need to be approved before they are published.