Definindo uma pilha de caracteres em Java
1. Visão geral
Neste tutorial, discutiremos como criar uma pilhachar em Java. Veremos primeiro como podemos fazer isso usando a API Java e, em seguida, veremos algumas implementações personalizadas.
Stack é uma estrutura de dados que segue o princípio LIFO (Last In First Out). Alguns de seus métodos comuns são:
-
push(E item) - empurra um item para o topo da pilha
-
pop() - remove e retorna o objeto no topo da pilha
-
peek() - retorna o objeto no topo da pilha sem removê-lo
2. Pilha deChar usando a API Java
Java possui uma API integrada chamadajava.util.Stack. Since char is a primitive datatype, que não pode ser usado em genéricos,we have to use the wrapper class of java.lang.Character para criar umStack:
Stack charStack = new Stack<>();
Agora, podemos usar os métodospush,pop epeek com nossoStack.
Por outro lado, podemos ser solicitados a criar uma implementação personalizada de uma pilha. Portanto, examinaremos algumas abordagens diferentes.
3. Implementação personalizada usandoLinkedList
Vamos implementar uma pilhachar usandoLinkedList como nossa estrutura de dados de back-end:
public class CharStack {
private LinkedList items;
public CharStack() {
this.items = new LinkedList();
}
}
Criamos uma variávelitems que é inicializada no construtor.
Agora, temos que fornecer uma implementação dos métodospush,peek epop:
public void push(Character item) {
items.push(item);
}
public Character peek() {
return items.getFirst();
}
public Character pop() {
Iterator iter = items.iterator();
Character item = iter.next();
if (item != null) {
iter.remove();
return item;
}
return null;
}
Os métodospushepeek estão usando os métodos integrados de aLinkedList. Parapop, primeiro usamos umIterator para verificar se há um item no topo ou não. Se estiver lá, removemos o item da lista chamando o métodoremove _._
4. Implementação personalizada usando uma matriz
Também podemos usar uma matriz para nossa estrutura de dados:
public class CharStackWithArray {
private char[] elements;
private int size;
public CharStackWithArray() {
size = 0;
elements = new char[4];
}
}
Acima, criamos um arraychar, que inicializamos no construtor com uma capacidade inicial de 4. Além disso, temos uma variávelsize para controlar quantos registros estão presentes em nossa pilha.
Agora, vamos implementar o métodopush:
public void push(char item) {
ensureCapacity(size + 1);
elements[size] = item;
size++;
}
private void ensureCapacity(int newSize) {
char newBiggerArray[];
if (elements.length < newSize) {
newBiggerArray = new char[elements.length * 2];
System.arraycopy(elements, 0, newBiggerArray, 0, size);
elements = newBiggerArray;
}
}
Ao empurrar um item para a pilha, primeiro precisamos verificar se nossa matriz tem capacidade para armazená-lo. Caso contrário, criamos uma nova matriz e duplicamos seu tamanho. Em seguida, copiamos os elementos antigos para o array recém-criado e o atribuímos à nossa variávelelements.
Observação: para obter uma explicação de por que queremos dobrar o tamanho do array, em vez de simplesmente aumentar o tamanho em um, consulte esteStackOverflow post.
Finalmente, vamos implementar os métodospeek epop:
public char peek() {
if (size == 0) {
throw new EmptyStackException();
}
return elements[size - 1];
}
public char pop() {
if (size == 0) {
throw new EmptyStackException();
}
return elements[--size];
}
Para ambos os métodos, depois de validar que a pilha não está vazia, retornamos o elemento na posiçãosize – 1. Parapop, além de retornar o elemento, diminuímossize em 1.
5. Conclusão
Neste artigo, aprendemos como fazer uma pilhachar usando a API Java e vimos algumas implementações personalizadas.
O código apresentado neste artigo está disponívelover on GitHub.